◆ 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
▶ 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;
}
: 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
: 윈도우 화면을 만드는 도구 상자
▶ 구성 요소
: 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();
}
}
출력 결과