22.04.27

오혜원·2022년 4월 27일

java

목록 보기
10/18

Review

OOP 3대 특징
: inheritance (상속)
→ 다른 클래스 복제
→ 설계 개념
: polymorphism (다형성)
→ 상속의 부모 변수는 자식 객체의 주소 접근 가능
→ 설계 개념
: encapsulation (은형성)
→ 코드 은닉

Encapsulation (은형성)
: 데이터의 의도하지 않은 변경을 막으려는 개념
: data hidden - data 은닉
: 보호하려는 data를 private으로 선언 → private data에 접근하는 메소드(set, get 메소드)를 만들어주는 개념
→ set/get 메소드 - public 선언이 기본
→ set - data 입력
→ get - data 출력

// 상품 등록 class
class RegistProduct {
	String productName;
	int price;
	
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		// 입력 제한
		if(productName.length() <= 0) return;
		if(productName.trim().equals("")) return;
		
		this.productName = productName;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		// 입력 제한
		if (price < 0) return;
		
		this.price = price;
	}
}

◎ JDK
: 상속과 다형성 기반으로 제작
: 사용법은 은형성 참고

method override
: parent class는 child class 변수, 메소드 접근 불가능
▷ 해결 방법
: parent class의 인식 범위 확장

package ch05_1;

class Ch05_1Parent2 {
	String pVar = "parent";
	
	void print() {
		System.out.println(pVar);
	}
}

class Ch05_1Child2 extends Ch05_1Parent2 {
	String cVar = "child";
	
	void print() {
		System.out.println(pVar + " - " + cVar);
	}
}

public class Ch05_1Ex10 {
	public static void main(String[] args) {
		Ch05_1Parent2 p = new Ch05_1Child2();

		p.print();
	}
}

출력 결과
parent - child


다형성(Polymorphism)

Polymorphic Arguments
: 다형성 응용
→ Arguments 자리에 부모 타입의 변수를 사용하면, 모든 자식 타입의 객체 접근 가능

package ch05_1;

class Ch05_1Print {
	void print(People p) {
		// 부모 타입 변수 p는 자식 타입의 객체에 접근 가능
		p.print();
	}
}
public class Ch05_1Ex11 {
	public static void main(String[] args) {
		Teacher t = new Teacher();
		t.name = "길동";
		
		Student s = new Student();
		s.name = "감찬";
		
		Ch05_1Print print = new Ch05_1Print();
		print.print(t);
		print.print(s);
	}
}

출력 결과
이름 : null길동 주소 : null 전화번호 : null 과목 : null 급여 계좌 : null
이름 : null감찬 주소 : null 전화번호 : null 학년 : null 반 : null

super
: 부모를 지칭하는 키워드 / 문법
: 자식 class에서 부모의 method를 호출할 때 사용 (ex. super.부모메소드();)
: 자식의 생성자에서 ()와 함께 사용되면, 부모의 생성자 호출
→ super는 생성자의 첫 번째 라인에서만 사용 가능

package ch05_1;

class Ch05_1Parent3 {
	String memVar = "parent memVar";
	
	public Ch05_1Parent3() {
		System.out.println("부모 클래스 생성자 호출");
	}
	
	public Ch05_1Parent3(String s) {
		System.out.println(s);
	}
	
	void print() {
		System.out.println("Ch05_1Parent3의 print 메소드");
	}
}

class Ch05_1Child3 extends Ch05_1Parent3 {
	String memVar = "child memVer";
	
	public Ch05_1Child3() {
		super();
		// 이후 라인에 super 작성 시, error
//		super("부모 생성자 호출");
	}
		
	void print() {
		System.out.println("  ▷▶Ch05_1Child3의 print 메소드");
		// 자식에서 부모를 호출하고 싶을 때 사용 : super
		super.print();
		// 같은 
		System.out.println("memVar : " + memVar);
		System.out.println("super.memVar : " + super.memVar);
	}
}

public class Ch05_1Ex12 {
	public static void main(String[] args) {
		Ch05_1Parent3 p = new Ch05_1Child3();
		p.print();		// method override에 의해 자식 print() 호출
	}
}

출력 결과
부모 클래스 생성자 호출
▷▶Ch05_1Child3의 print 메소드
Ch05_1Parent3의 print 메소드
memVar : child memVer
super.memVar : parent memVar

has a relationship
: 멤버로 다른 객체 소유 가능
: instance는 instance 소유 가능
: 객체는 객체 소유 가능
: class는 class 소유 가능

class Ch05_1Dummy {
	// Dummy 객체는 People 객체, People [] 객체 소유 가능
	People p;
	People [] pArr;
}

Access Modifiers (접근 제한자)

: class, 변수, 메소드에서 접근 권한(보안) 등을 제한하는 역할
: class는 public, default만 가능
: 변수, 메소드는 public, protected, default, private 모두 가능

public
: 접근 제한 X

protected
: 같은 패키지(폴더) 안의 class / 상속 관계 class에서만 접근 가능

◆ ProtectedObject.java

package ch05_1.access;

public class ProtectedObject {
	protected String protectedStr = "String of Protected modifier";
	
	protected void protectedPrint() {
		System.out.println("protectedStr : " + protectedStr);
	}
}

◆ Access3Protected.java

package ch05_1.access;

public class Access3Protected {
	public static void main(String[] args) {
		ProtectedObject obj = new ProtectedObject();
		System.out.println(obj.protectedStr);
		obj.protectedPrint();
	}
}

출력 결과
String of Protected modifier
protectedStr : String of Protected modifier

◆ Access3Protected2.java

package ch05_1;

import ch05_1.access.ProtectedObject;

public class Access3Protected2 {
	public static void main(String[] args) {
		// 다른 package의 경우 import를 통해서 접근 가능
		ProtectedObject obj =new ProtectedObject();
		
		// error, 다른 package(폴더)에서 protected 변수, 메소드에 접근 불가
//		System.out.println(obj.protectedStr);
//		obj.protectedPrint();
		
	}
}

◆ Access3Protected3.java

package ch05_1;

import ch05_1.access.ProtectedObject;

// 다른 폴더의 class 상속(import, extends)
public class Access3Protected3 extends ProtectedObject {
	public static void main(String[] args) {
		ProtectedObject obj = new ProtectedObject();
		// error, 
//		System.out.println(obj.protectedStr);
//		obj.protectedPrint();
		
		Access3Protected3 test = new Access3Protected3();
		test.protectedStr = "상속 후 접근 가능";
		test.protectedPrint();
	}
}

출력 결과
protectedStr : 상속 후 접근 가능

dafault
: 같은 패키지(폴더) 안의 class에서만 접근 가능
: 접근 제한자 자리에 별도의 작성 X

◆ DefaultObject.java

package ch05_1.access;

public class DefaultObject {
	String defaultStr = "String of default modifiers";
	public String defaultStr2 = "String of public modifiers";
	
	void defaultPrint() {
		System.out.println("defaultStr : " + defaultStr);
	}
	
	public void defaultPrint2() {
		System.out.println("defaultStr2 : " + defaultStr2);
	}
}

◆ Access2Default.java

package ch05_1.access;

public class Access2Default {
	public static void main(String[] args) {
		DefaultObject obj = new DefaultObject();
		System.out.println(obj.defaultStr);
		obj.defaultPrint();
	}
}

출력 결과
String of default modifiers
defaultStr : String of default modifiers

◆ Access2Default2.java

package ch05_1;

import ch05_1.access.DefaultObject;

public class Access2Default2 {
	public static void main(String[] args) {
		// 같은 package가 아니면 접근 불가 > import 필요
		DefaultObject obj = new DefaultObject();
		
		// error, default 변수, 메소드는 다른 폴더에서 접근 불가
//		System.out.println(obj.defaultStr);
//		obj.defaultPrint();
		
		// public은 다른 폴더에서 접근 가능
		System.out.println(obj.defaultStr2);
		obj.defaultPrint2();
	}
}

출력 결과
String of public modifiers
defaultStr2 : String of public modifiers

◆ Access2Default3.java

package ch05_1;

import ch05_1.access.DefaultObject;

public class Access2Default3 extends DefaultObject {
	public static void main(String[] args) {
		// 같은 package가 아니면 접근 불가 > import 필요
		DefaultObject obj = new DefaultObject();
		
		Access2Default3 test = new Access2Default3();
		// error, 상속을 받은 후에도 다른 package면 default 변수, 메소드에 접근 불가
//		System.out.println(test.defaultStr);
//		test.defaultPrint();
	}
}

private
: 같은 class 내부에서만 접근 가능
▷ 사용 목적
: 외부로부터 보호하려는 변수나 메소드 지정하는 의미
: 값을 함부로 바꾸면 안되는 변수 등을 보호
: 현재 class에서만 의미가 있는 메소드 (비공개 메소드)
: private 변수는 변수에 접근 가능한 방법(메소드) 제공 - set변수명, get변수명
→ set변수명 : 변수에 값을 넣을 때 사용
→ get변수명 : 변수의 값을 가져올 때 사용
→ 직접적인 변수 접근을 차단, set/get 메소드만을 사용해서 접근하도록 제한

◆ PrivateObject.java

package ch05_1.access;

public class PrivateObject {
	private int age;
		
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		if (age < 0) return;	// void + return은 메소드 종료
		this.age = age;
	}
	
	private void privatePrint() {
		// private method :  현재 class 내부에서만 사용 용도로 만들어진 메소드
		System.out.println("age : " + age);
	}
}

◆ Access1Private.java

package ch05_1.access;

public class Access1Private {
	public static void main(String[] args) {
		PrivateObject obj = new PrivateObject();
//		obj.age = 25;		// error, private 접근 불가능
//		obj.privatePrint();	// error, private 접근 불가능
		obj.setAge(25);
		System.out.println("age : " + obj.getAge());
	}
}

출력 결과
age : 25


AWT (Abstract Window Toolkit)

: 윈도우 화면을 만드는 도구 상자

구성 요소
: container - 다른 객체를 담는 일종의 그림판 (Frame, panel)
: layout - 그림판 위에 객체의 위치를 정해주는 개념
: components - 그림판 위에 올라가는 객체들 (Button, CheckBox 등)
: menu : 메뉴 (MenuBar, Menu, MenuItem 등)

Frame 주의 사항
: 반드시 setVisible(true);
: Frame은 두 개 이상 동시 사용 불가 (한 번에 1개만 사용 가능)
: add()를 통해 다른 components를 삽입 가능

▷ BorderLayout
: 컴포넌트를 중앙, 동, 서, 남, 북으로 배치
: Frame은 BorderLayout default layout - 기본 적용

◎ BorderLayout 주의사항
: 동, 서, 남, 북 중에서 없는 부분은 중앙이 차지

▷ GridLayout
: 컴포넌트를 엑셀 표처럼 배치
→ 좌에서 우로, 위에서 아래로 배치

◆ AWT 계산기 GUI

package ch09;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;

public class AWT6Test {
	public Frame frm;
	public TextField txt;
	public Panel pan;
	public Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0;
	public Button btnEqual, btnPlus, btnMinus, btnMulti, btnDivide, btnClear;
	public GridLayout grid;
	
	public AWT6Test(String str) {
		frm = new Frame(str);
		pan = new Panel();
		txt = new TextField();
		grid = new GridLayout(4, 4);
		btn1 = new Button("1");
		btn2 = new Button("2");
		btn3 = new Button("3");
		btn4 = new Button("4");
		btn5 = new Button("5");
		btn6 = new Button("6");
		btn7 = new Button("7");
		btn8 = new Button("8");
		btn9 = new Button("9");
		btn0 = new Button("0");
		btnEqual = new Button("=");
		btnPlus = new Button("+");
		btnMinus = new Button("-");
		btnMulti = new Button("*");
		btnDivide = new Button("/");
		btnClear = new Button("C");
	}
	
	public void makeGUI() {
		frm.setSize(500, 500);
		frm.setVisible(true);
		frm.add(txt, BorderLayout.NORTH);
		frm.add(pan, BorderLayout.CENTER);
		pan.setLayout(grid);

		pan.add(btn7);
		pan.add(btn8);
		pan.add(btn9);
		pan.add(btnDivide);
		
		pan.add(btn4);
		pan.add(btn5);
		pan.add(btn6);
		pan.add(btnMulti);
		
		pan.add(btn1);
		pan.add(btn2);
		pan.add(btn3);
		pan.add(btnMinus);
		
		pan.add(btnClear);
		pan.add(btn0);
		pan.add(btnEqual);
		pan.add(btnPlus);		
	}
	
	
	
	public static void main(String[] args) {
		AWT6Test test = new AWT6Test("First Window");
		test.makeGUI();
	}
}

출력 결과

0개의 댓글