ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 상속 , 접근제한자,추상클래스
    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
Designed by Tistory.