• 주목적 : - 기업 관점 : 개발 속도를 축소시켜 비용 절감, 확장이 유연하게 고려 - 재사용 + 개선(재정의) - 메소드를 상속 받고 내용 수정(개선)
• 클래스 간에 상속 관계 의미 - 이미 존재하는 클래스를 기반으로 새로운 클래스 개발 - 부모 클래스 / 자식 클래스 구조 관리 - 부모 클래스에서 자식 클래스로 상속 시키는 구성 요소 - 멤버 변수와 메소드만 상속 - 예외 없이 모든 클래스의 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";
}
}