Java 2번째 - 7장(기억 할 것들)

이정민·2021년 11월 9일
0

상속(inheritance)

  1. 코드의 재사용

  2. 두 클래스를 부모와 자식으로 관계를 맺어줌

  3. 조상의 모든 맴버를 상속 받는다.

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



단일 상속(Single Inheritance)

java는 단일상속만 허용한다.

class TvDVD extends Tv, DVD {     ----->// 2개 상속 못받음 2개중 1개 골라야 한다.
}



포함(composite)

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

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

class Circle {
   Point c = new Point();
   int r;
}



오버라이딩(overriding)

상속받은 조상의 메서드를 자신에 맞게 변경하는 것 (voerride : 덮어쓰다)

메서드를 상속 받았는데 그 메서드를 오버라이딩 할 경우 오버라이딩한 메서드가 호출 된다.


오버라이딩 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다. (반환타입, 메서드이름, 매개변수 개수)
    내용만 변경가능(구현부)

  1. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

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



참조변수 super

인스턴스 메서드(생성자)내에만 존재

조상맴버와 자신의 맴버를 구별할 때 사용

super, this 로 구별
(붙이지 않으면 가까운쪽 불러온다.)

조상생성자 호출할 때 super()이용

{중요!!}-생성자의 첫줄에 반드시 생성자를 호출해야한다.
그렇지 않으면 컴파일러가 생성자의 첫줄에 super()를 삽입한다.




final

final 클래스 - 확장될 수 없는 클래스(다른 클래스의 조상이 될 수 없다.)

final 메서드 - 오버라이딩을 통해 재정의 될 수 없다.

final 맴버변수, 지역변수 - 값을 변경할 수 없다.(상수)




접근제어자 (access modifier)

private : 같은 클래스 내에서만 접근이 가능하다.

(default) : 같은 패키지 내 내에서만 접근이 가능하다.

protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.

public : 접근 제한이 전혀 없다.




캡슐화를 위한 접근 제어자 이용

public class Time {
   public int hour;	// 범위 0~23
   public int minute;	// 범위 0~59
   public int second;	// 범위 0~59
}

Time t = new Time();
t.hour = 25;	//멤버변수에 직접 접근

이런식으로 멤버변수에 직접 접근 할 경우 변수에 들어가는 값에 제한을 둘 수 없다.

public class Time {
   private int hour;
   private int minute;
   private int second;
   
   
   public void setHour(int hour) {
      if (isNotValidHour(hour)) return;
      this.hour = hour;
   }
   
   // 매개변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
   private boolean isNotValidHour(int hour) {
      return hour < 0 || hour > 23;
   }
   
   public int getHour() { return hour; }

그러므로 접근 제어자 private를 이용해서 접근을 막고 메서드를 통해서만 접근할 수 있게 함으로써 들어가는 값에 제한을 둘 수 있다. 이를 캡슐화라고 함




다형성(polymorphism)

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

Tv t	=	new SmartTv();
//조상 참조변수	/자손 객체



참조변수의 형변환

조상 자손 관계의 참조변수는 서로 형변환 가능

단 !!!!!, 같을 경우 불가능
Car c = new Car();
FireEngine f = (FireEngine)c

참조변수 c는 Car객체를 가르키고 있는데 멤버변수가 4개이다.
그런데 여기서 FireEngine f는 멤버변수를 5개 가지고 있기때문에 5개에서 4개를 가르키기 때문에 java.lang.ClassCastException 오류가 뜬다.




instanceof 연산자 (다형성 + 형변환)

package chapter7;

class Car {
	String color;
	int door;
	
	void drive() {
		System.out.println("drive, Brrrr~");
	}
	void stop() {
		System.out.println("stop!!");
	}
}

class FireEngine extends Car {
	void water() {
		System.out.println("water!!!");
	}
}
----------------------------------------------------------
public class 형변환 {

   public static void main(String[] args) {		
		
      class Practice {
			
         void doWork(Car c) { //다형성 Car c = new Car(), new FireEngine()
				
            if(c instanceof FireEngine) { //형변환 가능한지, 조상Car로(리모콘) 형변환 가능한지 물어보면 자손들은 조상보다 객체수가 많기 때문에 참이 된다.
					
               System.out.println("< if 문 >");
               System.out.println(c instanceof FireEngine); //형변환 가능한지 true, false로 알려줌 이때는 (형변환)필요없음
               System.out.println(c instanceof Car);
               FireEngine fe = (FireEngine)c; //조상 참조변수이지만 가르키고있는 객체는 자손객체이다. 그렇기 때문에 형변환이 가능하다.
               fe.water();                   // 4개만 사용할 수 있지만 가르키고있는 객체는 5개이다. 그래서 위와같이 형변환이 가능.
					
					
            }else {
					
               System.out.println("< else 문 >");
               System.out.println(c instanceof FireEngine);
               System.out.println(c instanceof Car);
               FireEngine Fire = (FireEngine)c; //이미 만들어진 객체는 조상객체로 4개 속성가지고 있다.
                                               //그런데 자손은 그것보다 더 많은 5개를 가지고 있고 4개를 가지고있는 객체를 가리키게되면 오류가 생기게 된다.
					
            }
          }
       }
			
               Practice p = new Practice();
			
			
               p.doWork(new FireEngine());
               System.out.println("-----------------------");
               p.doWork(new Car());
		
		
	}

}

//====== 실행 결과 ========


< if>
true
true
water!!!
-----------------------
< else>
false
true
Exception in thread "main" java.lang.ClassCastException: chapter7.Car cannot be cast to chapter7.FireEngine
	at chapter7.형변환$1Practice.doWork(형변환.java:79)
	at chapter7.형변환.main(형변환.java:91)
profile
안녕하세요.

0개의 댓글