Language/Java

상속, 다형성, MVC pattern

do-oni 2021. 7. 26. 23:26

07.26 TIL

 

상속

• 주목적 :
- 기업 관점 : 개발 속도를 축소시켜 비용 절감, 확장이 유연하게 고려
- 재사용 + 개선(재정의) - 메소드를 상속 받고 내용 수정(개선)

 • 클래스 간에 상속 관계 의미
- 이미 존재하는 클래스를 기반으로 새로운 클래스 개발
- 부모 클래스 / 자식 클래스 구조 관리 - 부모 클래스에서 자식 클래스로 상속 시키는 구성 요소
- 멤버 변수와 메소드만 상속
- 예외 없이 모든 클래스의 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";
	}

}

 

1번 요청 출력 결과