자바(Java) - JFrame 버튼 예제

안녕하세요

이번 시간에는 Frame이 아닌 좀 더 좋은 JFrame을 이용해서

간단한 버튼 예제 소스 코드를 올릴까 합니다.

일단 결과 화면은 아래와 같습니다



버튼이 4개가 있고, 각 버튼을 누를 때 마다 간단한 이벤트가 있습니다.

소스코드도 간단하니 이해하시는데 무리는 없을겁니다~!

public class test extends JFrame{
JButton b1,b2,b3,b4;
ImageIcon icon1,icon2,icon3,icon4,icon5,icon6;
public test(){
super("::MySwing::");
Container cp=this.getContentPane();
cp.setLayout(new GridLayout(1,0)); //1행으로 고정, 열은 add하는 수만큼 가변적으로
icon1=new ImageIcon("images/up.PNG");
icon2=new ImageIcon("images/down.PNG");
icon3=new ImageIcon("images/over.PNG");
icon4=new ImageIcon("images/딸기 쉐이크.png");
icon5=new ImageIcon("images/코카-콜라.png");
icon6=new ImageIcon("images/리코타 치즈 상하이 버거.png");
b1=new JButton("Input",icon1);
b2=new JButton("Message",icon4);
b3=new JButton("Confirm",icon5);
b4=new JButton(icon6);
//add(b1);//swing은 컴포넌트를 직접 JFrame에 부착해선 안되고, ContentPane이라는 컨테이너를 얻어와서 컨텐트페인에 붙여야 한다
//컨텐트 페인의 기본 레이아웃은 BorderLayout
cp.add(b1); cp.add(b2); cp.add(b3); cp.add(b4);
//버튼에 마우스오버시 아이콘 설정
b1.setRolloverIcon(icon3);
//마우스 누를 때 아이콘 설정
b1.setPressedIcon(icon2);
//텍스트의 수직 위치=>top
b2.setVerticalTextPosition(JButton.TOP);
//텍스트의 수평 위치=>center
b2.setHorizontalTextPosition(JButton.CENTER);
b2.setMnemonic('C'); // ALT+C
//b3텍스트 bottom center로 위치
b3.setVerticalTextPosition(JButton.BOTTOM);
b3.setHorizontalTextPosition(JButton.CENTER);
b3.setMnemonic('C'); //Alt+C
b4.setMnemonic('A'); //Alt+A
b4.setToolTipText("이건 풍선 도움말이에요~~"); //마우스를 갖다대면 뜸
MyEventHandler my=new MyEventHandler();
b1.addActionListener(my);
b2.addActionListener(my);
b3.addActionListener(my);
b4.addActionListener(my);
//awt는 창닫기를 WindowEvent 처리를 해주야하지만
//swing은 창닫기 처리를 메소드로 지원함
// 창이 종료될 때 어떤 동작을 할지 결정하는 함수
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//System.exit(0)과 동일
}
class MyEventHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
Object obj = e.getSource();
if(obj==b1){
//JOptionPane의 InputDialog 띄워서 "당신의 이름은?"
//=>사용자가 입력한 이름을 타이틀에 올리기
String str = JOptionPane.showInputDialog(b2, "당신의 이름은?");
setTitle(str);
}else if(obj==b2){
//MessageDialog 띄워서 "반가워요" 메시지를 띄우세요
JOptionPane.showMessageDialog(b2, "반가워요", "오류", JOptionPane.ERROR_MESSAGE,icon1);
}else if(obj==b3){
// ConfirmDialog 띄워서 "종료할까요?"
//"예", "아니오" 버튼만 나오도록
//"예"를 누르면 종료시키기
int result=JOptionPane.showConfirmDialog(b2, "종료할까요?", "확인", JOptionPane.YES_NO_OPTION);
if(result==JOptionPane.YES_OPTION){ //버전업 하면 0이 유효하지 않기 때문에.. JOptionPane.YES_OPTION으로 정정하는게 좋음
System.exit(0);
}
}else if(obj==b4){
//MessageDialog를 띄위되 이미지만 나오도록
//JOptionPane.showMessageDialog(b4, " ", title, messageType, icon1);
JOptionPane.showMessageDialog(b1,"","ImageViewer",JOptionPane.INFORMATION_MESSAGE,icon6);
}
}
}//inner class ///////////////////////
public static void main(String[] args) {
test my=new test();
my.setSize(700, 400);
my.setVisible(true);
}
}

자바(Java) - Frame을 활용하여 로그인 화면 구현하기

안녕하세요

이번 시간에는 자바 Frame을 활용하여 아이디와 패스워드를 입력한 후에 로그인 하여 메인 페이지로 이동하는 것을 구현할까 합니다.

먼저 로그인 화면을 구축하기 전에..

'퐁'씨라는 성을 가진 성만 입장이 허용되고, '콩' 씨라는 성은 절대 입장이 안된다는 예외 처리와, 기타 다른 성씨도 입장이 안된다는 예외 처리를 하는 클래스를 만들까 합니다.

자 소스코드 바로 보실까요~!

//사용자 정의 예외 클래스
class NotSupportedNameException extends Exception{

public NotSupportedNameException(){
super("지원되지 않는 이름입니다.");
}

//오버로드
public NotSupportedNameException(String msg){
super(msg);
}
}

public class PongSite {

public static void login(String name, String pwd) throws NotSupportedNameException{
System.out.println("***Login Page***");
char lastName=name.charAt(0); // 인수 name의 0번째, 즉 성을 체크

if(lastName=='퐁'){
System.out.println(name+"님 환영합니다.");
}else if(lastName=='콩'){
//사용자 정의 예외 발생
throw new NotSupportedNameException("콩씨는 절대로 입장 불가");
/* throw new 예외();
* throw와 throws는 세트로 함께 사용하자.
* */
}else{
//기타 성씨인 경우
throw new NotSupportedNameException("기타 성씨분들은 이용에 제한이 있어요");
// 문자 지우면 6번 super 메시지 출력
}
}

public static void main(String[] args) {
// 명령줄 인수로 이름, 비번을 받자
if(args.length!=2){
System.out.println("명령줄 인수 2개를 입력하세요[이름, 비밀번호]");
return;
}

String name=args[0]; String pwd=args[1];
try{
login(name,pwd); // PongSite의 login 함수로 입력 값 던져주기
}catch(NotSupportedNameException e){
String msg=e.getMessage(); // 예외 메시지를 문자열로 반환한다.
System.out.println(msg);

//스택기록을 출력하여 예외가 발생된 지점을 보여줌(디버깅용으로 사용)
e.printStackTrace();
return;
}

System.out.println(">>>사이트 이용<<<");

}
}

여기서 잠깐 결과 화면을 보여드리고 핵심 소스 코드를 보여드리겠습니다.




화면은 총 2개로 로그인 화면, 메인 화면으로 간단하게 구성했습니다.

저렇게 구현하기 위해 필요한 소스는 아래와 같습니다.

//사용자 정의 예외 클래스
public class MemberApp extends Frame implements ActionListener{
Panel loginP, mainP;
Panel p1,p2,p3;
CardLayout card;
Label lbName, lbPwd;
TextField tfName, tfPwd;
Button btLogin, btReset, btExit;
Button btBack, btExit2; // mainP에 붙이기
//btBack하면 loginP로 돌아가기
//btExit2=>종료
public MemberApp(){
super("::MemberApp::");
card = new CardLayout();
setLayout(card); // 카드레이아웃으로 설정
loginP = new Panel(); mainP = new Panel();
loginP.setBackground(new Color(102,111,123));
mainP.setBackground(Color.lightGray);
add(loginP,"loginP"); add(mainP,"mainP");
p1=new Panel(new BorderLayout());
loginP.add(p1);
p2=new Panel(new GridLayout(2,1,10,10)); // 라벨만 붙인다.
p3=new Panel(new GridLayout(2,1,10,10)); // 텍스트필드만 붙인다.
p1.add(p2, "West"); p1.add(p3, "Center");
p2.add(lbName=new Label("이   름:")); p2.add(lbPwd=new Label("비밀번호:"));
p3.add(tfName=new TextField(20)); p3.add(tfPwd=new TextField(20));
Panel p4=new Panel(); // 버튼 부착
p1.add(p4, "South");
p4.add(btLogin=new Button("Login"));
p4.add(btReset=new Button("Reset"));
p4.add(btExit=new Button("Exit"));
setBackground(new Color(102,111,123));
mainP.add(btBack=new Button("이전으로"));
mainP.add(btExit2=new Button("종   료"));
// 버튼 이벤트 리스너 등록 
btLogin.addActionListener(this);
btReset.addActionListener(this);
btExit.addActionListener(this);
btBack.addActionListener(this);
btExit2.addActionListener(this);
}
@Override // 오버라이드는 부모가 exception을 하지 않았으면 throws를 하지 못한다.
public void actionPerformed(ActionEvent e){
Object o=e.getSource();
if(o==btLogin){
loginCheck();
}else if(o==btReset){
tfName.setText(" ");
tfPwd.setText(" ");
tfName.requestFocus(); // 이름 텍스트 창에 포커스 맞추기
}else if(o==btExit||o==btExit2){
System.exit(0);
}else if(o==btBack){
JOptionPane.showMessageDialog(this, "로그인 페이지로 이동하겠습니다");
card.show(this, "loginP");
setBackground(new Color(102,111,123));
}
}
public void loginCheck(){
//1) tfName, tfPwd로부터 입력한 값 받아오기
String lastName=tfName.getText().trim();
String lastPwd=tfPwd.getText().trim();
//유효성 체크(빈문자열 체크) -> exception으로 처리하자(소스코드로 구현해도 되지만..)
//String 클래스 메소드
//- trim():문자열 앞 뒤에 있는 공백을 제거한다.
//char charAt(int index) : 특정 인덱스의 문자 1자를 반환한다.
//2) 퐁씨만 허용 PongSite.login(name, pwd)
try{
PongSite.login(lastName, lastPwd);
JOptionPane.showMessageDialog(btReset, "로그인을 환영합니다.");
card.show(this, "mainP");
setBackground(Color.lightGray);
}catch(NotSupportedNameException ee){
String message=ee.getMessage();
JOptionPane.showMessageDialog(this, message);
tfName.setText(""); tfPwd.setText(""); tfName.requestFocus();
return;
}catch(java.lang.StringIndexOutOfBoundsException ee){
String message="이름, 비번을 모두 입력하세요";
JOptionPane.showMessageDialog(this, message);
tfName.requestFocus();
return;
}
}
public Insets getInsets(){
return new Insets(70,10,10,20);
}
public static void main(String[] args) {
MemberApp my = new MemberApp();
my.setSize(400, 400); my.setVisible(true);
}
}

자바(Java) - 프레임(Frame)의 마우스 이벤트 기본 예제

안녕하세요

이번 시간에는 자바 프레임(Frame)에서 마우스 이벤트를 활용하는 간단한 예제를 올릴까 합니다.

***********************************************
이벤트 소스 : Frame
이벤트 : MouseEvent
이벤트 핸들러 : MouseListener를 상속받는다.
************************************************



보시다시피 창 화면에 마우스 왼쪽 버튼을 누르면 타이틀에 클릭한 x,y 좌표의 위치가 출력되고 '나를 클릭해보세요' 멘트가 이동합니다.

또한 오른쪽 마우스 버튼을 누르면 Open(O), Save(S) 라는 팝업 메뉴가 뜹니다.

자 그럼 소스코드를 볼까요~

package testtest;

import java.awt.*;
import java.awt.event.*;

//MouseListener는 인터페이스고 추상메소드가 5개이기 때문에, 5개 메소드를 다 구현해야한다.
public class test extends Frame implements MouseListener {

String str="나를 클릭해보세요";
int x=50,y=50;
PopupMenu pm;
MenuItem mi1, mi2;

public test(){
super("::MouseE::");
//팝업메뉴 생성 및 부착
pm=new PopupMenu();
add(pm); //add해도 나타나지 않는다. show()해야 나타남

mi1=new MenuItem("Open(O)"); mi2=new MenuItem("Save(S)");
pm.add(mi1); pm.addSeparator(); pm.add(mi2);

//마우스 이벤트 리스너 부착
this.addMouseListener(this);

}

// MouseListener 5개 추상메소드 구현

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){
//마우스 오른 버튼을 누를때만 팝업메뉴가 뜨도록 처리
if(e.getButton()==MouseEvent.BUTTON3){
pm.show(this, e.getX(), e.getY());
}

}

//Press->Release->Click //반응속도가 제일 빠른 Press
public void mousePressed(MouseEvent e){
x=e.getX(); y=e.getY();
setTitle("x :"+ x +" y : " + y);
repaint();
//paint()메소드는 우리가 호출할 수 없고, JVM이 호출해준다.
//우리는 repaint()를 호출함으로써 JVM이 paint()를 호출하도록 유도할 수 있다.
}

public void mouseReleased(MouseEvent e){}

@Override
public void paint(Graphics g){
g.setColor(Color.BLUE);
g.drawString(str, x, y);
}

public static void main(String[] args) {
test my = new test();
my.setSize(400,400);
my.setVisible(true);

}
}

자바(Java) - 해시테이블(HashTable) 개념 및 예제

안녕하세요

이번 시간에는 자바에서 해시테이블(HashTable)에 대한 개념과 예제를 올려봅니다.

저도 책을 통해 처음 알았습니다.



HashTable은 Map(인터페이스) 계열에 속하며

Object 유형을 저장할 수 있으며, key와 value를 매핑하여 저장합니다.

또한 데이터가 75% 차면 자동으로 저장 영역을 확대하고 key값의 중복을 허용하지 않습니다. 

- 데이터 저장 : Object put(Object key, Object val)
- 데이터 꺼내오기 : Object get(Object key)
- 벡터는 순서, Map은 무순서


그럼 해시테이블 예제와 결과 화면을 보여드리겠습니답~!

package testtest;

import java.util.*;

public class test {
public static void main(String[] args) {
Hashtable h=new Hashtable();
h.put("하나", new Integer(1));
h.put("둘", "Two");
h.put("셋", "Red");
h.put("파랑", java.awt.Color.blue);
Object val=h.get("둘");
String str=(String)val; // Object 유형의 val을 String형으로 바꾼다, (Generic을 안써서 불편하다)
System.out.println(str);
java.awt.Color cr=(java.awt.Color)h.get("파랑");
System.out.println(cr);
//Generic을 사용하지 않으면 형변환을 해야한다.
//Generic을 사용하려면 저장할 유형(K,V)을 두개 지정해야한다.
//Generic => Hashtable(K,V)
Hashtable<String,Integer> h2=new Hashtable<String,Integer>();
h2.put("생년", new Integer(1945));
h2.put("나이", 79); //Auto Boxing -> 자동으로 래퍼클래스로 변환
h2.put("연봉", new Integer(5000));
Integer age=h2.get("나이");
System.out.println("age: "+age);
/*Enumeration<K> keys() : 키 값들을 Enumeration(반환) / 객체로 반환한다.
Returns an enumeration of the keys in this hashtable.
Enumeration<V> elements() : value 값들을 Enumeration(반환) / 객체로 반환한다
Returns an enumeration of the values in this hashtable.
Collection<V> values() : value 값들을 Collection 형태로 반환한다. / 객체로 반환한다
Returns a Collection view of the values contained in this map.
*/
//h2의 키 값을 반복문 통해 추출하여 출력하기
//키 값을 String형으로
//Enumeration<K> keys()
Enumeration<String> en=h2.keys();// en에 커서가 있다
while(en.hasMoreElements()){
String key=en.nextElement();
Integer val2=h2.get(key);
System.out.println(key+"==>"+val2);
}
Enumeration<Integer> en2=h2.elements();
for(;en2.hasMoreElements();){
Integer val3=en2.nextElement();
System.out.println(val3);
}
System.out.println("==============");
//Iterator<E> iterator() 
//Returns an iterator over the elements in this collection. 
Collection<Integer> en3=h2.values();
Iterator<Integer> it=en3.iterator();
while(it.hasNext()){
Integer i=it.next();
System.out.println(i);
}
System.out.println("########################");
//확장 for 루프
for(Integer i:en3){
System.out.println("i="+i);
}
}
}



자바(Java) - 벡터 클래스와 캡슐화 활용 예제

안녕하세요

이번 시간에는 저번 시간에 활용했던 백터(Vector)와 캡슐화를 활용한 예제를 올려봅니다.

package testtest;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;

class Person{
private String name;
private int age;

public Person(){

}

public Person(String name, int age){
this.name=name;
this.age=age;
}

public void setName(String name){
this.name=name;
}

public String getName(){
return name;
}

public void setAge(int age){
this.age=age;
}

public int getAge(){
return age;
}

}

public class test {

public static void main(String[] args) {
//[1]Person 객체 3개 생성하기
Person p1 = new Person("할아버지",78);
Person p2 = new Person("할머니", 74);
Person p3 = new Person("아버지", 55);
p1.setName("할아버님"); p1.setAge(79);

//[2]위에 생성한 객체를 저장할 Vector생성하기
Vector<Person> v1=new Vector<Person>();

//[3]Vector에 Person객체 저장하
v1.add(p1); v1.add(p2); v1.add(p3);

//[4] v1에 저장된 Person을 꺼내서 이름, 나이 출력하기
for(int i=0;i<v1.size();i++){
System.out.println("이름 : "+v1.get(i).getName() + " 나이 : "+v1.get(i).getAge());
}

System.out.println("--확장 for 루프--");

//확장 for루프
for(Person str:v1){
System.out.println("이름 : " + str.getName() + " 나이 : " + str.getAge());
}

//Vector의 메소드
//[1] void copyInto(Object[] anArray)
//벡터에 저장된 객체를 배열에 카피해준다.

Person arr[]=new Person[v1.size()];
v1.copyInto(arr);

for(Person ps : arr){
System.out.println(ps.getName()+"#");
}

//[2] Enumeration<E> elements()
/* 벡터에 저장된 객체들을 한꺼번에 꺼내오고자 할 때 사용하는 메소드
* Enumeration과 Iterator인터페이스는 객체들을 집합체로 관리하게 해주는 인터페이스이다.
* 이들 인터페이스에서는 각각의 객체들을 한 순간에 하나씩 처리할 수 있는 메소드를 제공한다.
*
* # Enumeration의 경우
* boolean hasMoreElements(): 논리적 커서(첫번째 요소 직전에 위치) 이후에 요소들이 있는지 물어서 있으면 true를 반환 하고 없으면 false를 반환한다.
* E nextElement() : 논리적 커서를 다음 요소로 이동하고 현재 가리키고 있는 요소를 반환한다.
*
* #Iterator의 경우
* boolean hasNext()
* E next()
* */

Enumeration<Person> en=v1.elements();
while(en.hasMoreElements()){
Person ps=en.nextElement();
System.out.println(ps.getName()+"@"+ps.getAge());
} // false면 while문을 빠져나감

//[3] Iterator<E> iterator()
//v의 iterator()메소드를 이용해 v에 저장된 객체 꺼내와 이름 나이 출력하세요.

Iterator<Person> it=v1.iterator();
for(int i=1;it.hasNext();i++){
Person ps=it.next();
System.out.println(i+": "+ps.getName());
}

}
}


자바(Java) - java.util.Vecotr 클래스란?

안녕하세요

이번 시간에는 Vector 클래스의 개념과 간단한 예제를 올려볼까 합니다.

자바에서 벡터(Vector)란 Object 유형의 Collection으로서, 어떤 유형의 객체도 저장할 수 있습니다. (하지만 기본 자료형은 저장이 불가합니다)

벡터는 몇 가지 특징이 있습니다.

- 벡터는 데이터가 가득 차면 자동으로 저장 영역을 확대합니다.

- java.util.List 인터페이스를 구현하는 클래스로 순서대로 정렬되고, 중복도 허용하는 특징을 갖습니다.


일단 벡터를 사용하기 이전에 몇 가지 알아두어야 할게 있습니다.

1) Vector 클래스 생성자

1 - Vector() // 10개 요소를 저장할 공간
2 - Vector(int initialCapacity) // 초기치 용량을 매개변수로 정함
3 - Vector(int initialCapacity, int incre) // 초기 용량과 증가치를 인자로 넣어줌

2) Vector에 요소 저장

Vector v = new Vector(5);
v.add("Hello"); v.add(new Integer(10)); // 벡터의 0번째, 1번째에 순차적으로 저장

3) Vector에서 꺼내오기

Object obj = v.get(0);
String str=(String)obj;
Integer i=(Integer)v.get(1);

4) elements()/iterator()로 벡터 요소 꺼내오기

- Enumeration과 Iterator인터페이스는 객체들을 집합체로 관리하는데, 이들 인터페이스에는 각각의 객체들을 한순간에 하나씩 처리할 수 있는 메소드를 제공합니다.

- Vector의 메소드 : Enumeration elements()
/***********************************************
Enumeration 인터페이스에 있는 주요 메소드
1>boolean hasMoreElements()
2>E nextElement()
***********************************************/

- Vector의 메소드 : Iterator iterator()
/***********************************************
Enumeration 인터페이스에 있는 주요 메소드
1>boolean hasNext()
2>E next()
3>void remove()
***********************************************/

자 그럼 벡터를 활용한 간단한 예제와 결과 화면을 보면서 이 시간을 마무리 짓겠습니답

package testtest;

import java.util.*;
import static java.lang.System.out;

public class VectorTest {

public static void main(String[] args) {

Vector v=new Vector(5,3);
//초기 용량 : 5, 증가치 : 3

out.println("v의 용량: "+v.capacity()); // 5
out.println("v의 크기: "+v.size()); // 0

for(int i=1;i<=10;i++){
v.add(new Integer(i));
}

out.println("벡터v에 요소 저장 후-------------");
out.println("v의 용량: "+v.capacity()); //11 i가 5일때 +3, 10일때 +3
out.println("v의 크기: "+v.size()); //10

v.add(new Double(3.14)); //double 유형의 객체로 new를 안했을시 Autoboxing되어 저장됨(하지만 new를 하는게 좋음)
v.add("Hello");

//벡터는 object유형의 객체를 저장할 수 있다.
out.println("v의 용량: "+v.capacity()); //14
out.println("v의 크기: "+v.size()); //12

//벡터에 요소 저장하기 => add(Object o), addElement(Object o)

//벡터에 요소 꺼내오기 => Object get(int index), Object elementAt(int index)

Object obj=v.get(3);
Integer i=(Integer)obj;
out.println("i="+i);

Double dbl=(Double)v.get(10);
out.println("dbl="+dbl);
out.println("----5.0이후---------------");

//Generic 사용
//v2는 String유형만 저장하는 벡터가 된다.
Vector<String> v2=new Vector<String>();
for(i=1;i<6;i++){
v2.add("Java "+i);
}

String str=v2.get(0); // Generic을 사용하면 형변환이 필요없다~!
System.out.println("str="+str);

//for루프 이용해서 한꺼번에 v2에 저장된 요소를 출력하세요
for(int j=0;j<v2.size();j++){
String s=v2.get(i);
out.print(s);
}

//벡터를 생성하여 Float객체 3개를 저장하세요
//Generic 사용해서 for루프 이용해 꺼내와 출력하세요
Vector<Float> v4=new Vector<Float>(3,2);
v4.add(10.456f);
v4.add(new Float(12.56));
v4.add(100f);
v4.add(1, new Float(312)); // 인덱스가 1인 곳에 312.0을 저장
     //(index, Object)

for(int j=0;j<v4.size();j++){
Float fval=v4.get(j);
out.println(fval);
}

//Generic을 사용했다면 확장 for루프 이용할 수 있다.
out.println("#####");
for(Float a:v4){
out.print(a);
}

//[문제1]확장 for루프를 이용해 arr에 저장된 값 출력하세요
//배열은 애초에 같은 데이터가 있기 때문에 Generic 안 사용해도 됨

int arr[]={1,2,3,4};
for(int x:arr){
out.println(x);
}

//[문제2]v2를 확장 for루프 이용해 출력하세요
for(String s:v2){
out.println(s);
}

}
}

== 결과 화면 ==



자바(Java) - 로컬 이너클래스 간단 예제

안녕하세요

이번 시간에는 자바에서 활용도가 높은 로컬이너클래스 예제를 올려볼까 합니다.

잘 봐주세요~!!

/*로컬이너클래스: 메소드 블럭 내부 또는 인스턴스 블럭 내부에 클래스를 구성한 경우를 의미
 * 1)이름있는 로컬 이너클래스
 * 2)이름없는 로컬 이너클래스
 * */
public class Local {

String str = "@@@"; // 멤버변수
public void foo(){
class LocalInner{ // 일정 범위 내에서 동일한 이름으로 클래스 설정 가능

}
}

public void sub(){
final int num=100; // //지역변수(8버전 이후 fianl 안붙여도 됨)
System.out.println("str="+str);
System.out.println("num="+num);

// LocalInner a = new LocalInner(); <-- 이것은 안됨. 밑에가 구성되고 난 이후에 됨..

class LocalInner{
String lstr="####";
public void print(){
System.out.println("str: "+str);
System.out.println("lstr: "+lstr);
System.out.println("num: "+num);
/*이전 버전에서는 로컬 이너클래스 안에서는 final이 아닌 지역변수는 접근불가*/
}
}

LocalInner li = new LocalInner();
li.print();
/*로컬 이너클래스는 자기가 속한 메소드 안에서
* 객체 생성을 해야 한다.
* 다른 메소드에서는 객체생성 불가능.(main에서도 안됨)
* 또한 로컬이너클래스가 구성된 후에 객체 생성이 가능함
* */
}


public static void main(String[] args) {

Local lc = new Local();
lc.sub();
}
}

위의 소스 코드를 실행하시면 아래와 같은 결과 화면이 출력됩니다.




자바(Java) - 멤버(Member) 이너 클래스 예제

안녕하세요

이번 시간에는 Member Inner 클래스 예제를 올려봅니다.

이 부분은 계속 좀 보고 공부해야 될 것 같네요.

아직도 개념이 헷갈리네요 ㅋ ㅜ

public class Outer{
int a=10;
static int b=20;

class Inner{ //Inner Member- a)non-static 클래스
int c=30;
void sub(){
System.out.println("sub()");
}

}//Inner class//

static class SInner{ //Inner Member - b) static 클래스
int d=40;
void foo(){
System.out.println("foo()");
}

static void bar(){
System.out.println("bar()@@@");
}

}
} // Outec Class

이제 메인 클래스 InnerClassTest 에서 Outer 클래스의 변수 값을 출력해보겠습니다.

public class InnerClassTest {

public static void main(String[] args) {
//1)Outer 클래스의 a,b 변수값을 출력하세요
Outer o=new Outer();
System.out.println("o1.a = "+o.a);
System.out.println("o1.b = "+o.b);

//2)Inner 클래스의 c변수값 출력하고 sub() 메소드 호출하기
Outer o1=new Outer();
Outer.Inner oi=o1.new Inner();
System.out.println("oi.c = "+oi.c);
oi.sub();

// 위의 2줄을 한 줄로..
Outer.Inner o2=new Outer().new Inner();
o2.sub();

//3)SInner클래스의 d 출력, foo(), bar() 호출하기
Outer.SInner sn=nw Outer.SInner();
System.out.println("sn.d = "+sn.d);
sn.foo();
Outer.SInner.bar(); // static이니 바로 접근 가능


}
}

위 예재를 실행한 결과 화면은 아래와 같습니다.



자바(Java) - Inner Class 정의 및 분류

안녕하세요

이번 시간에는 자바에서 이해하기 좀 어려운 개념인 이너클래스(Inner class)에 대해 글을 써봅니다.

개인적으로 저한테 좀 헷갈려서 블로그에서 정의도 해볼겸, 글 쓰면서 다시 한번 개념을 복습하려고 합니다 ㅜ

먼저 Inner Class의 정의는

'클래스 안에 클래스를 구성하는 것' 입니다.



위 그림을 보시면 클래스 A 안에 클래스 B가 있습니다. 

그 클래스 B를 Inner 멤버 클래스라고 하며, non-static 클래스. static 클래스로 나뉘어집니다.

클래스 B 밑에 func 함수가 있는데, 그 안에 클래스 C가 있습니다.

그 클래스 C를 Inner 로컬 클래스라고 합니다. 

Inner 로컬 클래스는 Named Local Class(이름 있는 로컬 클래스)와 Anonymous Class(이름 없는 클래스)로 나뉘어집니다.

이 포스팅 이후에 이너 클래스의 예제를 올려봅니다.

자바(Java) - Frame을 이용하여 간단한 메모장 만들기

안녕하세요

이번 시간에는 자바에서 Frame을 이용하여 메모장을 만드는 것을 해봅니다.

먼저 제가 만든 결과 화면은 아래와 같습니다.




크게 메뉴는 파일(F), 색상(C)으로 두 개 있고, 각각의 메뉴에 세부 메뉴가 있습니다.

자 그럼 이제 소스코드를 한번 보시죠~


public class MyNotePad extends Frame implements ActionListener(){
 TextArea ta;
 MenuBar bar; 
 menu mnFile, mnColor, mnNew, mnFntColor;
 MenuItem miOpen, miSave, miExit;
 MenuItem miBgY, miBgG, miFgR, miFgB; // 배경, 글자색
 Label lb;
public MyNotePad(){
 super(":::MyNotePad v1.1:::");
 ta=new TextArea();
 add(ta, "Center");
 lb=new Label("Status");
 add(lb, "South");
 //1.메뉴바를 Frame에 붙인다.
 //메뉴바를 붙일 때는 setMenuBar()를 이용
 bar = new MenuBar();
 setMenuBar(bar);
 //2.메뉴를 생성해서 메뉴바에 붙인다.
 mnFile=new Menu("파일(F)");
 mnColor=new Menu("색상(C)");
 bar.add(mnFile); bar.add(mnColor);
 //MenuShortcut은 단축키 지정
 miOpen=new MenuItem("열기(O)", new MenuShortcut('O'));
 MenuShortCut ms = new MenuShortCut('S');
 miSave = new MenuItem("저장(S)", ms);
 miExit = new MenuItem("끝내기(X)", new MenuShortcut('X', true);
 //구분선 주기
 mnFile.addSeparator();
 mnFile.add(Exit);
 mnFile.addSeparator();
 //서브메뉴 만들기
 //메뉴에 메뉴를 붙이면 서브 메뉴가 된다.'
 mnNew = new Menu("New(N)");
 mnFile.add(mnNew);
 mnNew.add(new MenuItem("New File");
 mnNew.add(new MenuItem("Java Project");
 mnNew.add("Package"); //문자열로 메뉴 아이템을 등록해도 됨
 //색상의 상단메뉴
 miBgY = new MenuItem("배경색-Yellow"); miBgG = new MenuItem("배경색-Gray");
 mnFntColor = new Menu("글자색");
 mnColor.add(miBgY); mnColor.add(miBgG);
 mnColor.addSeparator(); mnColor.add(mnFntColor);
 //색상의 서브메뉴
 miFgR = new MenuItem("Red"); miFgB = new MenuItem("Blue");
 mnFntColor.add(miFgR); mnFntColor.add(miFgB);
 mnFntColor.addSeparator();
 mnFntColor.add(new MenuItem("Reset");
 //4) 메뉴아이템에 리스너 부착
 miOpen.addActionListener(this);
 miSave.addActionListener(this);
 miExit.addActionListener(this);
 miBgY.addActionListener(this);
 miBgG.addActionListener(this);
 miFgR.addActionListener(this);
 miFgB.addActionListener(this);
 //Reset 리스너 부착
 mnFntColor.addActionListener(this);
     
 }//Constructor()------
 
 @Override
 public void actionPerformed(ActionEvent e){
  Object o=e.getSource();
  //reset 처리(문자열 비교)
  String cmd=e.getActionCommand();
  if(cmd.equals("Reset")){
   ta.setBackground(Color.white);
   ta.setForeground(Color.black);
  }
  if(o==miExit){
   //시스템 종료 코드
   System.exit(0);
  }else if(o==miOpen){
   //FileDialog 객체를 생성해서 setVisible(true)메소드를 호출한다.
   //Frame f1 = new Frame();
   FileDialog fd = new FileDialog(this);
   fd.setVisible(true);
  
   //fd에서 선택한 파일의 절대경로를 만들어서 lb에 보여주세요.
   String dir=fd.getDirectory(); // 상위 디렉토리 경로
   String fname=fd.getFile(); // 파일명
   lb.setText(dir+fname);
   String filename=dir+fname;
   //FileReadExceptionTest(제가 직접 클래스 파일로 작성했습니다) 재사용하자
   try{
    String contents=FileReadExceptionTest2.readFile(filename)
    ta.setText(contents);
   }catch(FileNotFoundException ee){
    JOptionPane.showMessageDialog(ta, filename+"파일을 찾을 수 없습니다");
   }catch(IOException ee){
    ta.setText("입출력 오류 발생");
   }catch(Exception ee){
    lb.setText("기타 오류 발생");
   }
  }else if(o==miSave){
   //save는 딱히 구현하지 않았습니다(나중에 추가하겠습니다)
  }else if(o==miBgY){
   ta.setBackground(Color.yellow);
  }else if(o==miBgG){
   ta.setBackground(Color.gray);
  }else if(o==miFgR){
   ta.setForeground(Color.red);
  }else if(o==miFgB){
   ta.setForeground(Color.blue);
  }
 }
  
 public static void main(String args[]){
  MyNotePad my = new MyNotePad();
  my.setSize(500,500);
  my.setVisible(true);
 }
}

미스테리생물(Mysterious creatures No.20) - 데본기 시대에서 바다의 해왕색 패기.. '던클레오스테우스'


안녕하세요

오랜만에 미스테리 생물을 쓰네요..

쓸 시간은 있었지만 피곤해서 못썼습니다.

오늘 소개할 생물은 데본기 바다에서 가장 쎈 생물인 '던클레오스테우스' 입니다.

자 한번 보시죠



 

 사진이 좀 작게 나와서 이 생물의 크기가 좀 작아보입니다.
크기는 대략 10m가 넘고 두께가 5cm.. 5cm가 얇아보이지만 자를 보면 결코 작은게 아닙니다..





 

 이 생물은 또 '갑옷물고기'라고도 불립니다.






 

 이 사진을 보면 아시겠지만 정말 갑옷을 입은것처럼 보입니다.
그리고 이 생물은 '이빨'이 없습니다. 이빨을 쓰지 않고 위 아래턱에 날카로운 '뼈'를 사용합니다.





데본기 시대에 던클레오스테우스의 유일한 적수가 하나 있었는데,

그 생물의 이름은 티타니크티스입니다.

하지만 데본기 시대의 최강의 생물들도..




 

 3억 8천년전 데본기 시대에서 최강이였지만 메갈로돈 같은 생물을 만났으면...
아주 개털렸을겁니다;;



자바스크립트 - 자동차 가격 옵션 체크 박스 예제

안녕하세요

이번 시간에는 저번 시간에 있었던 체크박스 기초 예제를 좀 응용한 예제입니다.

먼저 결과 화면을 보자면 아래와 같습니다.


기본 차량가격은 13450000원입니다.

하지만 옵션에 있는 항목들을 체크하면 기존 차량가격에 플러스가 됩니다.

폼 화면은 그냥 직접 구현해 보시고

로직만 공개하겠습니답~!



/*자동차 옵션 체크 박스를 클릭할 때 마다 함수 
정의문 내에 일련의 실행문을 실행합니다.*/
function car(){
  //[1]초기의 차량 기본 가격(id=total)을 알아내 변수에 할당한다.
 var basic=document.getElementById('total').defaultValue; // 초기값(13450000)만 가져온다, 변경 안됨 
 var basicPrice=parseInt(basic);
 //[2] opt1 ~ opt3 까지 체크박스에 체크가 되어 있으면
    //옵션 가격을 기본 가격에 누적 시킨다.
 for(var i=1;i<=3;i++){
  //체크박스 참조를 얻어온다.
  var obj=document.getElementById('opt'+i);
  if(obj.checked){
   basicPrice+=parseInt(obj.value);
  }
 }
 //[3] 총 가격(id가 total) 요소에 총누적가를 출력한다.
 document.getElementById('total').value=basicPrice;
}
 

자바스크립트 - 전체 선택 체크박스를 클릭하면 모든 옵션이 체크하는 예제

안녕하세요

이번 시간에는 간단한 실습을 할까 합니다.



위 그림처럼 전체선택 체크박스를 누르면 아래의 세개의 체크박스가 동시에 체크되고

다시 한번 전체선택 체크박스를 누르면 세개의 체크 된것이 사라지는 예제입니다.

간단하니 이해하시기 쉬울겁니다.



var objAll=document.getElementById('allChk');
var ch1=document.getElementById('opt1');
var ch2=document.getElementById('opt2');
var ch3=document.getElementById('opt3');
objAll.onclick=function(){
 //전체 선택에 체크했다면 모든 체크박스를 체크
 if(this.checked){ // this란 체크박스(objAll)
  ch1.checked=true;
  ch2.checked=true;
  ch3.checked=true;
 }else{
  //아니면 모두 해제
  ch1.checked=false;
  ch2.checked=false;
  ch3.checked=false;
 }
}