minghxx.blog
  • 자바의 정석 73~74강 오버라이딩, 참조변수 super, 생성자 super()
    2023년 08월 05일 05시 47분 48초에 업로드 된 글입니다.
    작성자: 민발자
    728x90

    ch 7-7~9 오버라이딩

    1. 오버라이딩

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

    선언부 변경불가, 구현부만 변경가능

    class Point {
    	int x;
    	int y;
        
    	String getLocation(){
    		return "x :" + x + "y :" + y;
    	}
    }
    
    class Point3D extends Point {
    	int z;
    
    	// 상속받은 getLocation()을 오버라이딩 
    	String getLocation(){
    		return "x :" + x + "y :" + y + "z: " + z;
    	}
    }

     

    2. 오버라이딩 조건

    • 선언부가 조상 메서드와 일치(반환타입, 메서드 이름, 매개변수 목록)
    • 접근 제어자를 조상 메서드보다 좁은 범위로 변경 불가 
    • 예외는 조상 메서드보다 많이 선언 불가

     

    3. 오버로딩과 오버라이딩

    오버로딩 : 이름만 같을 뿐 기존에 없는 새로운 메서드를 정의 new

    오버라이딩 : 상속받은 메서드의 내용을 변경 change

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

    ch 7-10~11 참조변수 super, 생성자 super()

    1. 참조변수 super

    객체 자신을 가리키는 참조변수, 인스턴스 매서드(생성자)내에만 존재, static 메서드내에서 사용 불가

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

    this와 유사

    // 조상 멤버와 자신 멤버 구별
    class Parent{
    	int x = 10; // super.x
    }
    
    class Child extends Parent {
    	int x = 20; // this.x
    	void method() {
    		System.out.println(this.x); // 20
    		System.out.println(super.x); // 10
    	}
    }
    
    // super와 this 같을 수 있음
    class Parent{
    	int x = 10; // super.x, this.x 둘 다 해당
    }
    
    class Child extends Parent {
    	void method() {
    		System.out.println(this.x); // 10
    		System.out.println(super.x); // 10
    	}
    }

     

    2. super()

    조상의 생성자를 호출할 때

    상속은 생성자와 초기화블럭 상속 불가

    조상의 멤버는 조상의 생성자를 호출하여 초기화

    class Point{
    	int x, y;
    	
    	Point(int x, int y){
    		this.x = x;
    		this.y = y;
        }
    }
    
    class Point3D extends Point {
    	int z;
    	
    	Point3D(int x, int y, int z){
    		// 자신 멤버 초기화 
    		this.z = z;
            
    		/*
    		조상 멤버 초기화
    		this.x = x;
    		this.y = y;
    		*/
            
    		// 조상의 생성자를 호출해 초기화하는것이 더 바람직
    		super(x, y);
    	}
    }

     

    3. super() 조상 생성자 조건

    생성자의 첫 줄에 반드시 생성자 호출 → 미호출시 컴파일러가 자동으로 첫줄에 super(); 삽입함

     

    728x90
    댓글