본문 바로가기
Study/JAVA

[2022-11-28] Java의 정석 - 객체지향II

by 까다로운오리 2022. 11. 29.

 

상속

: 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

: 코드의 재사용성을 높이고 코드의 중복 제거하여 생산성, 유지보수에 크게 기여함

: 단일 상속만 가능하다.

class Parent {
   int age;
}

class Child extends Parant {
	void play()
    	{	
        	//내용
    	}
}
조상 클래스 : 상속해주는 클래스 , 부모클래스, 상위클래스 , 기반클래스
자손 클래스 : 상속 받는 클래스 , 자손 클래스, 하위 클래스, 파생된 클래스

만일 Parent클래스에 age라는 정수형 변수를 멤버 변수로 추가하면, 자손 클래스는 조상의 멤벌르 모두 상속 받기 때문에, Child 클래스는 자동적으로 age라는 멤버 변수가 추가된다.

 

- 자손 클래스의 멤버변수 개수는 조상 클래스 보다 항상 같거나 많다.

- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.

 

클래스간의 관계 - 포함관계

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

class Point {
    int x;
    int y;
    }

 

 

is는 상속
has는 포함관계로 설정한다.

 

 

Object 클래스

:Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속 받게 한다.

class Tv {
	...
}

//를 컴파일하면 자동적으로

class Tv extends Object {
	...
}

 

 


오버라이딩

:조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것 (change, modify)

 

조건

- 이름이 같아야 한다.

- 매개 변수가 같아야 한다.

- 반환 타입이 같아야 한다.

즉, 선언부가 서로 일치해야 한다.

 

 

조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때

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

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

3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

class Point {
    int x;
    int y;
    
    String getLocation() {
    	return "x :" + x + ", y" + y ;
	}	
}


class Point3D extends Point {
	int z;
    
    String getLocation() {
            return "x :" + x + ", y" + y + ", z" + z;
	}
}

 

오버라이딩 vs 오버로딩

class Parent {
    void parentMethod() {}
}

class Child extends Parent {
	void parentMethod() {} // 오버라이딩
    void parentMethod(int i) {} // 오버로딩
    
    void childMethod() {} 
    void childMethod (int i) {} // 오버로딩
}

 

super

: 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수.

: 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구별할 수 있다.

 

class SuperTest{
	public static void main(String args[]){
    	Child c = new Child();
        c.method();
    }
}

class Parent {
	int x = 10;
}

class Child extends Parent {
	int x = 20;
    
	void method() {
    	System.out.println("x=" + x);
        // x = 20
        System.out.println("this.x=" + this.x);
        // this.x = 20
        System.out.println("super.x=" + super.x);
    	// super.x = 10
    }
}

 

변수 뿐 아니라 메서드도 super을 써서 호출할 수 있다.

class Point {
	int x;
    int y;
    
    String getLocation(){
    	return "x :" + x + ", y :" + y ;
    }
}

class Point3D extends Point {
	int z;
    
    String getLocation(){		//오버라이딩 
    	return super.getLocation() + ", z : " + z;
    }
}

 

 

super() - 조상 클래스의 생성자

Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 this()  또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super()를 생성자의 첫 줄에 삽입한다.

왜냐하면 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 한다.

 

class PointTest{
	public static void main(String args[]){
    	Point3D p3 = new Point3D(1,2,3);
    }
}

class Point {
	int x, y;
    
    Point(int x, int y){
    	this.x = x;
        this.y = y;
    }
    
    String getLocation() {
    	return "x :" + x + ", y :" + y;
    }
}

class Point3D extends Point {
	int z;
    
    Point3D(int x, int y, int z){
    	this(100,100,100);
    }
    
    Point3D(int x, int y, int z){
    	super(x,y);
        this.z = z;
    }
    
    String getLocation() {
    	return super.getLocation() + ", z: " + z ;
    }
}

 

 

Package 

: 하나의 디렉토리

: 클래스의 묶음

: 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.

 

import 

다른 패키지의 클래스를 사용할 때 "import 패키지명.클래스명;" 을 사용

 

static import

static멤버를 호출할 때 클래스 이름을 생략할 수 있다.

 

 


제어자

 

static - 클래스의 , 공통적인

 

멤버변수 

: 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.

: 클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.

:클래스가 메모리에 로드될 때 생성된다.

 

메서드

:인스턴스를 생성하지 않고도 호출이 가능한 static메서드가 된다.

:static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

 

 

final - 마지막의, 변경될 수 없는

클래스 : 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 다른 클래스의 조상 불가

메서드 : 오버라이딩을 통해 재정의 불가

멤버, 지역 변수 : 값을 변경할 수 없는 상수가 된다.

 

abstract - 추상의, 미완성의

클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미

메서드 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

 

접근제어자

private - 같은 클래스 내에서만 접근 가능

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

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

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

 

 


다형성

https://life-with-coding.tistory.com/485

책 내용이 이해가 잘 안가서 이분 블로그를 참고했다.

 

 

다형성이란 여러가지 형태를 가질 수 있는 능력을 의미하며 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 한다. 즉, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.

이 말을 더 쉽게 풀어 쓰면, 상위 클래스가 동일한 메세지로 하위 클래스들을 서로 다르게 동작시키는 원리를 말한다.

다형성을 활용하면 부모 클래스가  자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해 접근 가능한데, 바로 동적 바인딩 때문에 가능하다. 

 

동적 바인딩

:메서드가 실행 시점에서 성격이 결정되는 바인딩

 

 

다형성 필수 조건

1. 상속관계

2. 오버라이딩

3. 업캐스팅(형변환)

:자식 클래스의 객체가 부모클래스 타입으로 형변환 되는 것

 

구현 방법

1. 부모 자식 클래스 구현

2. 메소드 오버라이딩

3. 형변환 하여 객체 선언

4. 부모 클래스 객체로 자식 메소드 호출

 


내일은 추상 클래스 부터 다시~~ 하면서 자바의 정석1을 끝낼거다!

오늘 못적은 내용들도 적고~~ 복습 하면서 빠진부분이나 추가되는 부분도 적어야지