JAVA

[8회차-①] JAVA (GUI 기본)

킴크스 2021. 4. 2. 00:39

강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정

강의 날짜 : 21.04.01

 

<상속>

 

상속은 is - a관계

포함은 has a관계 ~은 ~을 가지고 있다. 구성 관계 또는 집합 관계를 나타낸다.

구성관계는 화살표 검정색, 집합 관계는 다이아몬드 화살표

 

1. 종단 클래스

 

상속을 시킬 수 없는 클래스이다.

필요한 이유는 주로 보안상의 이유이다.

 

public final class (클래스명) final로 인해 변경, 상속이 불가능!

 

만약 특정한 메소드만 오버라이드될 수 없게 만들려면 종단 메소드로 선언

 

2. 정적 메소드 오버라이딩

 

부모클래스의 메소드 중에서 정적 메소드를 오버라이딩하면 부모클래스 객체에서 호출되느냐 아니면 자식 클래스에서 호출되느댜에 따라 호출되는 메소드가 다르다.

일반적인 메소드의 경우는 오버라이딩 되면 자식 클래스의 메소드가 호출된다.

 

//부모 클래스
package April1st;

public class Animal {

	public static void eat() { //부모 클래스의 정적 메소드
		System.out.println("Animal의 정적 메소드 eat()");
	}
    
	public void sound() {
		System.out.println("Animal의 인스턴스 메소드 sound()");
	}
}
자식 클래스
package April1st;

public class Cat extends Animal{ //Cat이 Animal 상속
	
	public static void eat() { //자식 클래스의 정적 메소드
		System.out.println("Cat의 정적 메소드 eat()");
	}
    
	public void sound() {
		System.out.println("Cat의 인스턴스 메소드 sound()");
	}
	
	public static void main(String[] args) {
		Cat myCat = new Cat(); //변수 myCat은 Cat클래스 타입으로 Cat을 참조
		Animal myAnimal=myCat; //Animal클래스 타입의 변수 myAnimal가 myCat을 참조
		Animal.eat(); //부모 클래스에서 eat()메소드 호출
		myAnimal.eat(); //정적 함수를 호출하고 있는 것이 부모 타입을 가지고 있는 객체
		myCat.eat(); //정적 함수를 호출하고 있는 것이 자식 타입을 가직고 있는 객체
		myAnimal.sound(); //부모 타입을 가지고 자식을 참조하는 객체가 일반 메소드를 호출하므로 상향형변환으로 오버라이딩된 자식 클래스의 sound()가 호출
	}
}

 

< GUI>

 

GUI, 그래픽 유저 인터페이스는 컴포넌트로 구성되어있다.

컴포넌트는 레고블록의 블록 하나라고 생각하면 된다.

이 컴포넌트를 어떻게 구성하는냐에 따라 화면 구성 구현을 할 수 있다.

프레임은 최상위 컴포넌트이다.

 

1.종류

 

1) AWT : OS에 따라서 제공하는 자원이 달라짐

2) SWING : 어떤 환경에서도 일관된 화면을 보여줌

     

2.절차

 

 1) 컨테이너 생성

 최상위 컨테이너 : 절대 다른 컨테이너 안에 포함될 수 없는 컨테이너이다. (프레임, 다이알로그, 애플릿 등이 해당) 

 일반 컨테이너 : 다른 컨테이너 안에 포함될 수 있는 컨테이너

 

 2) 컴포넌트 추가

 

//GUI구현하기1
package April1st;

import java.awt.*;
import javax.swing.*;


public class MyFrame extends JFrame{ //JFram을 상속

	public MyFrame() {
		setSize(300,200); //사이즈 결정 메소드
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 종료 방법 결정 메소드
		setTitle("MyFrame"); //프레임 제목 삽입 메소드
		setLayout(new FlowLayout());//배치 마법사임. 물흐르듯배치를 부탁한다는 의미
		JButton button=new JButton("버튼"); //버튼 생성 메소드
		this.add(button); //추가 메소드
		setVisible(true); //화면 보이는 여부
	}
    
	public static void main(String[] args) {
		
		MyFrame f=new MyFrame(); //프레임 실행
	}

}

 

3. 기초 컴포넌트

 

* 패널(panel)

컴포넌트들을 포함하고 있도록 설계한 컨테이너 중의 하나이다.

프레임 화면을 두 개로 나누어서 표시하고자 할 때도 패널을 사용한다.

 

* 레이블(lable)

편집은 불가능하지만 텍스트를 표시한다.

 

* 버튼(button)

사용자가 클릭했을 경우, 이벤트를 발생하여 원하는 동작을 하게 한다.

 -라디오 버튼 : 그룹 중의 하나만 체크 가능

 -체크 박스 : 복수 선택 가능

 

* 텍스트 필드(text field)

입력이 가능한 한 줄의 텍스트 필드를 만드는 데 사용한다.

댓글의 경우에는 텍스트 에어리어를 사용한다.(한 줄이 아니므로)

 

4. 배치 관리자(Layout manager)

 

배치 관리자에 따라서 같은 어플도 다르게 보인다

FlowLayout
GridBagLayout
GridLayout
BorderLayout
BoxLayout
CardLayout

5. 배치 관리자의 설정

 

JPanel panel = new JPanel(new 배치관리자());

setLayOut(new 배치관리자()); 

 

6. 절대 위치로 배치하기

 

 1) 배치관리자를 null로 설정

    setlayout(null);

 

 2) add() 메소드를 사용하여 컴포넌트를 컨테이너에 추가

 

 3) setBounds()메소드를 사용하여 절대 위치와 크기를 지정

 

 4) 컴포넌트의 repaint() 메소드를 호출한다.

//절대 위치 배치하기
package April1st;

import javax.swing.*;

public class MyFrame2 extends JFrame{ //JFrame 상속
	JButton b1;
	private JButton b2,b3;
	
	public MyFrame2() { //생성자
		setTitle("Absolute Position Test");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(400,200);
		JPanel p = new JPanel();
		p.setLayout(null); //절대 위치 배치를 위해 배치관리자 null로 설정
		
		b1=new JButton("Button #1");
		p.add(b1); //패널에 버튼1 추가
		b2=new JButton("Button #2");
		p.add(b2); //패널에 버튼2 추가
		b3=new JButton("Button #3");
		p.add(b3); //패널에 버튼3 추가
		
		b1.setBounds(20,5,95,30); //버튼의 위치,사이즈 지정
		//=b1.setLocation(20, 5); 
		// b1.setSize(95, 30);
        //setBound=setLocation+setSize
		b2.setBounds(55,45,105,70);
		b3.setBounds(180,15,105,90);
        
		add(p); // 프레임에 패널을 추가
		setVisible(true); //화면 생성
	}
}
package April1st;

public class AbsolutePositonTest {

	public static void main(String[] args) {
	
		MyFrame2 frame=new MyFrame2(); //프레임 호출
	}
}