728x90
반응형

접근제한자의 종류


public : 어떤 클래스든 접근할 수 있다는 것을 의미
protected : 자기 자신, 같은 패키지, 서로 다른 패키지다 하더라도 상속받은 자식 클래스에서는 접근할수 있다는 것을 의미
default(접근제한자를 적지 않으면 default접근 지정자) : 자기자신과 같은 패키지에서만 접근할 수 있다는 것을 의미
private : 자기 자신만 접근할 수 있다는 것을 의미

 

 

메소드란?


사물은 상태와 행동으로 나뉨
여기서 상태는 필드(이름, 번호, 컬러)이고 행동(움직임)은 메서드임
메소드의 입력값은 매개변수, 결과값은 리턴값
매개변수(Parameter) : 전달된 인자를 받아들이는 변수
≒인자(Argument) : 어떤 함수를 호출시에 전달되는 값을 의미

 

 

추상클래스


추상 클래스란 구체적이지 않은 클래스를 의미 버스, 트럭은 구체적인 차를 지칭하는데 차, 새 같은 것은 구체적이지 않음 
이런 것을 구현한 클래스를 추상 클래스라고 함

 

 

추상 클래스 정의하기


1. 추상 클래스는 클래스 앞에 abstract 키워드를 이용해서 정의함
2. 추상 클래스는 미완성의 추상 메소드를 포함할 수 있음 
    - 추상 메소드란, 내용이 없는 메소드임. 즉 구현이 되지 않은 메소드임
    - 추상 메소드는 리턴 타입 앞에 abstract라는 키워드를 붙여야 함
3. 추상 클래스는 인스턴스를 생성할 수 없음.(부모로써의 역할은 O 추상클래스를 자체를 이용하여 객체 생성은 X) 

 


추상 클래스를 상속받는 클래스 생성하기


1. 추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메소드를 반드시 구현해야 함
2. 추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메소드를 구현하지 않으면 해당 클래스도 추상 클래스가 됨

 


super


나를 가르키는 키워드가 this였다면 부모를 가르키는 키워드는 super임
super()는 부모의 생성자를 의미함

>

public Bus(){

    super();  //부모의 기본생성자를 호출하며 자동으로 생성됨

    System.out.println("Bus의 기본생성자입니다.");

}


부모의 기본생성자가 아닌 경우 호출하는 방법
클래스는 기본 생성자가 없는 경우도 존재함

>
public class Car{
    public Car(String name){
        System.out.println(name + " 을 받아들이는 생성자입니다.");
    }
}
Car class가 위 처럼 수정되면, Bus생성자에서 컴파일 오류가 발생함
부모가 기본생성자가 없기 때문에 컴파일 오류가 발생하게 되는 것임


이런 문제를 해결하려면 자식 클래스의 생성자에서 직접 부모의 생성자를 호출해야 함 

>
public Bus(){
    super("소방차"); // 문자열을 매개변수로 받는 부모 생성자를 호출함
    System.out.println("Bus의 기본생성자입니다.");
}

 

오버라이딩


오버라이딩이란 부모가 가지고 있는 메소드와 똑같은 모양의 메소드를 자식이 가지고 있는 것임

즉 오버라이딩이란 메소드를 재정의 하는 것 
메소드를 오버라이드 하면, 항상 자식클래스에서 정의된 메소드가 호출됨
오버라이딩 한다고 해서 부모의 메소드가 사라지는 것은 아님
super 키워드를 이용하면, 부모의 메소드를 호출 할 수 있음

>
public class Bus extends Car{
    public void run(){
        super.run();  // **부모의  run()메소드를 호출 
        System.out.println("Bus의 run메소드");
    }
}

 


상속관계와 클래스 형변환


is a 관계
버스가 차를 상속받고 있다면(버스는 차다 가 성립됨) : 버스 객체를 차 타입의 참조변수로 참조할 수 있음
부모타입으로 자식객체를 참조하게 되면 부모가 가진 메서드만 사용 가능
>
Car c = new Bus();  //버스가 가진 메서드는 사용X 사용하고 싶다면 형변환 필요
//Car타입의 래퍼런스 변수 c, new Bus()는 생성된 인스턴스(형변환이 일어났다고 할 수있음) Car타입으로 Bus를 가리킴
>
Car c = new Bus();  
Bus bus = c;  //큰 그릇을 가리킬수 없음(버스는 차라고 할 수 있지만, 차는 버스라고 할수는 없음)
Bus bus = (Bus)c;  //이렇게하면 형변환일어남, 이것이 가능한 이유는 차가 참조하는 객체가 원래 버스였기에 가능함

 

 

클래스 형변환


객체들 끼리도 형변환이 가능함. 단 상속관계에 있었을 때만 가능
부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어남
부모타입의 객체를 자식타입으로 참조하게 할때는 명시적으로 형변환 해주어 함

단 이렇게 형변환 할때에는 부모가 참조하는 인스턴스가 형변환 하려는 자식타입일 때만 가능

기본 생성자(default constructor)에 의해 int형 변수는 0으로 초기화됨
자바에서 멤버변수는 default 값으로 초기화가 됩니다. int는 0으로 초기화가 됨

모든 멤버변수는 인스턴스(클래스의)가 만들어질때 heap 메모리에 올라감. heap 메모리에 올라가기 때문에 값을 가지고 있어야하기에 default값을 가지고 있어야함 
이에 반해 지역변수는 실제 사용할때 stack에 올라가기 때문에 default 값을 가지고 있지 않아서 초기화를 해줘야함

반응형
복사했습니다!