-
상속 , 접근제한자,추상클래스Back-end/Java 2020. 6. 17. 14:20
상속이란? 부모가 가진것을 자식에게 물려주는것을 의미한다.
-
노트북은 컴퓨터의 한 종류다.
-
침대는 가구의 한 종류다. 혹은 침대는 가구다.
-
소방차는 자동차다.
이렇게 말할 수 있는 관계를 is a 관계 혹은 kind of 관계라고 한다.
// Is - a 관계 : Bus 는 Car다. public class Bus extends Car { public void windows(){ System.out.println("창문"); } }
-
자바는 클래스 이름 뒤에 extends 키워드를 적고 부모클래스 이름을 적게 되면 부모 클래스가 가지고 있는 것을 상속받을 수 있게 된다.
-
상속이란 부모가 가지고 있는 것을 자식이 물려받는 것을 말한다. 즉, 부모가 가지고 있는 것을 자식이 사용할 수 있게 된다.
-
새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속받아서 속성이나 기능이 확장되는 클래스를 구현함
-
기존의클래스와 유사하나 확장된 기능.
부모가 가지고 있는 메소드외에 추가로 메소드를 선언하는 것을 확장하였다고 표현한다.
접근제한자
접근 제한자란 클래스 내에서 멤버의 접근을 제한하는 역할을 한다.
캡슐화 : 관련된 내용을 모아서 가지고 있는 것 (외부에 감추고싶은 특성과 메서드가 있을 것 )
접근제한자의 종류 public > protected > default > private
-
public
-
어떤 클래스든 접근할 수 있다는 것을 의미
-
-
protected
-
자기 자신, 같은 패키지, 서로 다른 패키지다 하더라도 상속받은 자식 클래스에서는 접근할수 있다는 것을 의미
-
-
private
-
자기 자신만 접근할 수 있다는 것을 의미
-
-
접근제한자를 적지 않으면 default접근 지정자
-
자기자신과 같은 패키지에서만 접근할 수 있다는 것을 의미
-
추상클래스
추상 클래스란 구체적이지 않은 클래스를 의미한다. 독수리, 타조는 구체적인 새를 지칭하는데 새, 포유류 같은 것은 구체적이지 않다. (추상 메서드를 포함한 클래스). 개념만 있음.
추상메서드 : 구현코드가없어 선언부만 있는 메서드
추상 클래스 정의하기
-
추상 클래스는 클래스 앞에 abstract 키워드를 이용해서 정의한다.
-
추상 클래스는 미완성의 추상 메소드를 포함할 수 있다.
-
추상 메소드란, 내용이 없는 메소드 이다. 즉 구현이 되지 않은 메소드이다.
-
추상 메소드는 리턴 타입 앞에 abstract라는 키워드를 붙여야 한다.
-
-
추상 클래스는 인스턴스를 생성할 수 없다. (객체가 될 수 없다 = new화 할수 없다)
public abstract class Bird{ public abstract void sing(); public void fly(){ System.out.println("날다."); } }
추상 클래스를 상속받는 클래스 생성하기
추상클래스 내부에는 일반 메소드 구현 가능
-
추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메소드를 반드시 구현해야 한다.
-
추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메소드를 구현하지 않으면 해당 클래스도 추상 클래스가 된다.
public class Duck extends Bird{ @Override public void sing() { System.out.println("꽥꽥!!"); } }
public abstract class Computer{ public abstract void display(); public void display(){} // body에 구현한것이없다고 추상메소드가 아니다. 구현을안하고 선언만 하려면 abstract를 붙여서 추상메소드로 만들어야함 (클래스에도 abstract) }
클래스형변환
부모타입으로 자식 객체를 참조하게 되면 부모가 가진 메서드만 사용할 수 있다.
public class BusExam { public static void main(String[] args) { Car c = new Bus(); // 부모가 자식을 가리킬 수는 있지만 이경우 // 부모가 가지고 있는 내용만 사용 가능(만든건 자식객체) //c.windows() --> // 에러가 난다. } }
자식객체가 가지고 있는 메소드나 속성을 사용하고 싶다면 형변환 해야 한다.
public class BusExam { public static void main(String[] args) { Car c = new Bus(); // 부모가 자식을 가리킬 수는 있지만 이경우 // 부모가 가지고 있는 내용만 사용 가능(만든건 자식객체) //c.windows() --> // 에러가 난다. // Bus bus = c; // -> 에러가 난다 왜 ? car는 더 큰 개념이기때문에 . 어떤것이 올수 있을지 모르니까 Bus bus = (Bus)c; // 에러가 안난다. bus.windows(); // -> 수행이 잘난다. } }
가능한 이유 : Car가 참조하는 객체가 원래 Bus였기 때문에 가능함.
만약 , Car c = new Car(); 로 생성됐다면 에러가 났을 것이다.
결론 : 클래스들끼리도 형 변환이 가능하다
출처 : 프로그래머스 자바 입문 강의
'Back-end > Java' 카테고리의 다른 글
Object 클래스 (0) 2020.06.21 Static이란 ? (0) 2020.06.20 문자형에서 정수형으로 형변환 (0) 2020.05.22 에러 ) return value ㅁㅁㅁ was not iterable. (0) 2020.01.28 클래스 (0) 2019.01.24 -