Language/Java
상속, 다형성, MVC pattern
do-oni
2021. 7. 26. 23:26
상속
• 주목적 :
- 기업 관점 : 개발 속도를 축소시켜 비용 절감, 확장이 유연하게 고려
- 재사용 + 개선(재정의) - 메소드를 상속 받고 내용 수정(개선)
• 클래스 간에 상속 관계 의미
- 이미 존재하는 클래스를 기반으로 새로운 클래스 개발
- 부모 클래스 / 자식 클래스 구조 관리 - 부모 클래스에서 자식 클래스로 상속 시키는 구성 요소
- 멤버 변수와 메소드만 상속
- 예외 없이 모든 클래스의 root는 java.lang.Object 클래스 - Object 클래스의 모든 멤버 상속
- 12개의 메소드만 존재, 12개의 메소드 상속 받는 상황
- 단, 자식 클래스 관점에서 때에 따라 고려해야 할 메소드 public String toString(){} public boolean equals(Object o){}
- 문법 : class 부모 클래스{ .. } class 자식 클래스 extends 부모 클래스{ 부모 클래스의 멤버 변수와 메소드 상속 자식만의 새로운 추가 개발 }
//부모 클래스 public class Parent extends Object { String msg = "부모"; public Parent() { super(); System.out.println("부모생성자"); } void print() { System.out.println("부모의 메소드"); } }
//자식 클래스 public class Child extends Parent { int history = 99; public Child() { super(); System.out.println("자식생성자"); } //재정의 = 상속 받은 메소드 편집(overriding, override) //rule = 반환타입 메소드명(argument_list) : 100% 일치 void print() { // System.out.println("부모의 메소드"); super.print(); //line수 무관하게 부모의 오리지날 메소드 로직 100% 적용 , 부모 메소드 호출 문법 System.out.println("자식의 메소드"); }
- 재정의(override/overriding) : 메소드를 상속 받고 내용 수정
다형성
- 많은 형태를 보유할 수 있다는 의미
- 상위타입의 변수는 하위타입의 모든 객체를 수용(대입)
- 상위타입 변수 = 하위타입객체;
- 전제조건
: 상속 관계여야만 성립되는 문법
- rule
상위타입 변수로 생성된 자식 객체의 멤버 호출시에는 상속 시킨 멤버에 한해서만 access(호출) 가능
Parent2를 상속받는 Child2 클래스 간에 Parent2 타입의 변수로 다형성 객체 생성시 제약사항
- Child2만의 멤버 호출은 불가
- 퀴즈 : O or X
class A extends Object()
class B extends A()
class C extends B()
class D extends Object()
Object o = new Object(); o
= new A(); o
= new B(); o
= new C(); o
= new D(); o
A a = new Object(); x
= new A(); o
= new B(); o
= new C(); o
= new D(); x
B b = new Object(); x
= new A(); x
= new B(); o
= new C(); o
= new D(); x
C c = new Object(); x
= new A(); x
= new B(); x
= new C(); o
= new D(); x
D d = new Object(); x
= new A(); x
= new B(); x
= new C(); x
= new D(); o
void 재사용킹왕짱메소드(Object v){ //객체
}
class Parent { int age; String name; void print() { System.out.println(age); System.out.println(name); }
public class Child extends Parent { String job = "it"; //모든 멤버 출력될수 있도록 print() 재정의하기 void print() { super.print(); System.out.println(job);
public static void main(String[] args) { /* Child.getData() : Object 타입으로 변환 * String 타입의 s변수엔 대입 불가 * 해결책 형변환 * * 현 로직 * - 문자열 데이터에서 index 값으로 해당 위치의 철자를 반환해서 활용 * - public char charAt(int index){ * parameter값에 위치한 철자를 하나 뽑아서 반환 * } * String 클래스에만 존재 따라서 String 타입이 아니면 메소드 호출 불가 */ String s = (String)Child.getData(); System.out.println(s.charAt(0)); //참조하는 문자열의 0번째 철자 반환해서 출력 //다형성 객체 생성, 반드시 상위타입의 변수로 생성하기 Parent p = new Child(); //모든 멤버 변수 값 대입 하기 p.name = "유재석"; p.age = 49; Child c = (Child)p; //p라는 변수의 Parent 타입을 하위타입인 Child로 변환 c.job = "연예인"; //모든 멤버 변수값 출력하기 c.print(); }
MVC pattern
1. M - Model
2. V - View
두가지 클래스
시작 클래스
결과 출력 클래스
3. C - Controller
5. 실습 구조
1. package명
step06.mvc.model / step06.mvc.view ..
2. class명
pattern명 사용
3. 사용 데이터
1번째 : 회의실에서 만난 나의 동료 이름
- 이름 : String
- 한명 이상의 이름 : String 배열
2번째 : 회의실에서 만난 나의 동료 이름과 성별
- Friend.java(이름/성별)
동료 수 만큼 객체 생성
//view 요청 클래스 package step06.mvc.view; public class StartView { public static void main(String[] args) { // public static void req(int no) { Controller.req(1); } }
//Controller 클래스 package step06.mvc.controller; import step06.mvc.model.Model; import step06.mvc.view.EndView; public class Controller { //조건문 1 : 동기들 이름 요청 //조건문 2 : 동기들 이름 + 성별 요청 public static void req(int no) { //이름들만 요청 if(no == 1) { //public static String[] getNames() String[] ns = Model.getNames(); ns[0] = "E"; EndView.printNames(ns); System.out.println("------------------"); System.out.println(ns[0]); }else if(no == 2) { //이름과 성별 요청 }else { //1 또는 2 아니다.. 경우의 수 처리 } } }
//Model 클래스 package step06.mvc.model; public class Model { //내 동료들 배열에 담아서 변환 public static String[] getNames() { String[] names = {"A", "B", "C", "D"}; return names; } //내 동료들 이름 + 성별 배열에 담아서 반환(Friend[]) }
//view 출력 클래스 package step06.mvc.view; public class EndView { public static void printNames(String[] ns) { for(String name : ns) { System.out.println(name); } ns[0] = "A"; } }