❗ 다형성

 

- 여러가지 형태를 가질 수 있는 능력

- 조상 타입 참조 변수로 자손 타입 객체를 다루는 것

           원래                                                            다형성
Tv  t  =  new  Tv( );                       =>              Tv  t = new SmartTv( ); // 타입불일치, 조상타입 참조변수로
SmartTv  s  =  new SmartTv( );                                                              자손타입객체를 다룰 수 있는 것  

- 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이?

SmartTv  s  =  new SmartTv( ); // 참조변수와 인스턴스의 타입이 일치
Tv           t   =  new SmartTv( ); // 조상 타입 참조변수로 자손 타입 인스턴스 참조

 

  ✔예시)

SmartTv  s  =  new SmartTv( );                                            Tv           t   =  new SmartTv( );

↳ 스마트 티비 리모컨(버튼 7개) = 7개 기능 사용가능           ↳ 티비 리모컨(버튼5개) = 7개 기능 가지고 있어도 5개 기능                                                                                                 만 사용가능

 

- 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.

Tv           t   =  new SmartTv( );   // OK. 허용
SmartTv  s  =  new Tv( );   // 에러. 허용 안 됨

 

  ✔예시)

            Tv           t     =        new SmartTv( );                             SmartTv           s   =             new Tv( );

          조상(기능 5개)           자손 (기능 7개)                          자손(기능 7개)                       조상(기능 5개)

 있는 기능을 안 쓰는 건 괜찮음 ( 5 < 7)                    실제가지고 있는 멤버개수보다  리모컨 버튼이 많으면 안됨 (7 >5)

'자바의 정석 > 객체지향' 카테고리의 다른 글

[객체지향] 제어자  (0) 2022.12.11
[객체지향] 오버라이딩(overriding)  (1) 2022.12.09
[객체지향] 단일상속, Object클래스  (0) 2022.12.06
[객체지향] 포함관계  (0) 2022.12.06
[객체지향] 상속  (0) 2022.12.05

❗ 제어자

 

- 클래스와 클래스멤버(멤버변수, 메서드)에 부가적인 의미 부여

 

- 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)

👀 static - 클래스의, 공통적인

 

  ✔ 예시)

 

👀 final - 마지막의, 변경될 수 없는

 

 

  ✔ 예시)

 

👀 abstarct - 추상의, 미완성의

 

 

  ✔ 예시)

 

'자바의 정석 > 객체지향' 카테고리의 다른 글

[객체지향] 다형성  (0) 2022.12.11
[객체지향] 오버라이딩(overriding)  (1) 2022.12.09
[객체지향] 단일상속, Object클래스  (0) 2022.12.06
[객체지향] 포함관계  (0) 2022.12.06
[객체지향] 상속  (0) 2022.12.05

😀 오버라이딩

 

- 상속받은 조상의 메서드를 자신에 맞게 변경하는 것

 

 

  ✔예시)

↳ 선언부는 변경불가, 구현부(내용)만 변경가능

 

↳ 오버라이딩 하면 조상꺼는 사용하지 않고 자손꺼를 사용한다

 

 

✔예시2)

class Point extends Object {
	int x;
	int y;
	
	public Point(int x,int y) {
		this.x = x;
		this.y = y;
	}
	
	@Override // Object 클래스의 toString()을 오버라이딩
	public String toString() {
		return "x :" + x + ", y: " + y;
	}

}

public class OverrideTest {

	public static void main(String[] args) {
		Point p = new Point(5,9);
//		p.x = 5;
//		p.y = 9;
		
		System.out.println(p); //p.toString()호출
//		System.out.println(p.toString());
//		System.out.println("p.x :"+p.x);
//		System.out.println("p.y :"+p.y);
	}

}

 

❗ 오버라이딩의 조건

 

   1.선언부가 조상 클래스의 메서드와 일치해야 한다.

 

 

  ✔예시)

class Point {
	int x;
    int y;
    
    String getLocation(){  // 선언부(반환타입,메서드이름,매개변수목록)
    	return "x : " + x + ", y : " + y;        
        }							  	
    } 											  
class Point3 extends Point {									  
	int z;										  		
    											  
    String getLocation(){  // 선언부 : 조상클래스의 메서드와 일치해야 함
    	return "x : " + x + ", y : " + y + ", z : " + z;
        }
    }

   2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. (접근제어자 ex) public,protected,private)

   3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

 

  ✔예시)

class Parent {
	void parentMethod() throws IOException, SQLException{ // 예외선언
    ...
    }
}   

class child extends Parent {
	void parentMethod() throws IOException{ // 예외선언 (자손은 조상클래스보다 많이 선언할 수 없다.)
    ...
    }
}

❗ 오버로딩 vs 오버라이딩

오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것(new) // 상속x
오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것 (change, modify)

 

  ✔예시)

class Parent {
	void parentMethhod() {} 
    
}

class Child extends Parent{
	void parentMethod() {}   // 오버라이딩
    void parentMeethod(int i) {} // 오버로딩
    
    void childMethod() {} // 메서드정의
    void childMethod(int i) {} //오버로딩
	void childMethod() {} // 중복정의 -에러

 

'자바의 정석 > 객체지향' 카테고리의 다른 글

[객체지향] 다형성  (0) 2022.12.11
[객체지향] 제어자  (0) 2022.12.11
[객체지향] 단일상속, Object클래스  (0) 2022.12.06
[객체지향] 포함관계  (0) 2022.12.06
[객체지향] 상속  (0) 2022.12.05

❓ 단일 상속

- java는 단일상속만을 허용한다.(c++은 다중상속 허용)

class TvDVD extends Tv,DVD {//에러 조상은 하나만 허용된다.

}

- 비중이 높은 클래스 하나만 상속관계로,나머지는 포함관계로 한다.

 

   ✔예시)

❗ Object 클래스 - 모든 클래스의 조상

 

-부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.

- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.

  toString(), equals(Obect obj), hashCode(),..

 

  ✔예시) toString ()

▶ toString()을 사용할 수 있는 이유 : Object 클래스를 상속받았기 때문

▶ System.out.println(c.toString()); = System.out.println(c); // 같은 문장

 

포함이란?

 

- 클래스의 멤버로 참조변수를 선언하는 것

- 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.

                                                                           ↓

                                                             Circle이 Point를 포함관계

 

👀 클래스 간의 관계 결정하기

   상속관계 '~은 ~이다.(is - a)'

   포함관계 '~은 ~을 가지고 있다.(has-a)' 

 

① 포함(90%,대부분 포함 사용)                   ②상속(꼭 필요할때만)

 

👍쉽게 구분하는 법

원(Circle)은 점(Point)이다. - Circle is a Point. ->상속

원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point. ->포함

 

  ✔예시)

①상속

② 포함

❗ 상속

 

-기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)

- 두 클래스의 부모와 자식으로 관계를 맺어주는 것

class 자식클래스 extends 부모클래스{

}

//예시
class Parent{}
class Child extends Parent { // Child 자식, Parent 부모

}

 

- 자손은 조상의 모든 멤버를 상속받는다.(생성자,초기화블럭 제외)

- 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)

 

  ✔예시)

- 자손의 변경은 조상에 영향을 미치지 않는다.

 

  ✔예시)

 

①   Point 클래스의 영향을 받지않음      ② 부모 클래스(Point)의 변경에 영향을 받음

 

 

👀 변수의 초기화

 

- 지역변수(lv)는 수동 초기화 해야함(사용전 꼭!!)

   메서드() 안에서 선언되면 지역변수(lv)

-  멤버변수(iv,cv)는 자동 초기화된다.

 

  ✔예시)

↳ 인스턴스 변수 : 자동초기화

                           int x= 0;바꿔주지 않아도 0으로 자동 초기화되어 int y = x; → x에 0값이 자동으로 넣어짐

지역변수 : 수동 초기화

                    수동으로 초기화 해야 해서  int i = 0; 으로 바꿔줘야 오류가 안 남

 

👀 멤버변수의 초기화

 

   1.명시적 초기화(=) (간단한 초기화)

 참조형 변수의 초기화는 객체를 만들어서 넣어주어야 함

 

   2.초기화 블럭 (복잡한 초기화에 사용)

- 인스턴스 초기화 블럭(iv) : { }

- 클래스 초기화 블럭(cv): static { } 

 

   3. 생성자 (iv초기화, 복잡한 초기화)

   

  ✔예시)


▶클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번

▶인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다  

 

❗ 초기화 순서

① cv → iv

② 자동(0) → 간단(=) → 복잡(static{ }, 생성자)

😀 생성자 this()

 

- 생성자에서 다른 생성자를 호출할 때 사용

- 다른 생성자 호출 시 첫 줄에서만 사용가능

 

✔예제)

↳ 첫 줄에서만 생성 가능 아니면 에러가  남

  Car(color, "auto",4) -> this(color,"auto",4) 바꿔줘야 함

 

 ✔예시) 코드 중복 제거 

 

😀 참조변수 this

 

- 인스턴스 자신을 가리키는 참조변수

- 인스턴스 메서드(생성자 포함)에서 사용가능

- 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

- 참조변수 this,  생성자 this() 는 ()로 구분

 

 ①                                              ②

↳ ② this가 있어야 iv로 간주

 ① 같은 클래스 안에서는 this 생략가능

↳ ② iv와 lv의 변수 이름이 같아서 this 생략 불가능

 

this : 참조변수 , this() : 클래스 이름  대신 사용

 

✔예시)

clas MyMath2{
	 long a, b; // this.a this.b => 진짜이름(this 생략가능)
     
     MyMath2(int a, int b) {// 생성자
     	this.a = a;
        this.b = b;  // lv와 iv를 구별하려고 this 사용, 
       				 //this는 생성자와 인스턴스 메서드에만 사용 가능
	}
    long add() {
		return a + b; // return this.a + this.b;
	}
    static long add(long a, long b){ // 클래스 메서드(static메서드),
    								 // this 사용불가 : this의 의미가 객체자신을 의미하기 때문
    	return a + b;
	}

+ Recent posts