본문 바로가기
개발/Java

[Java] 자바가 확장한 객체 지향

by devhooney 2022. 8. 4.
728x90

스프링 입문을 위한 자바 객체 지향의 원리와 이해를 읽고 간단한 정리.

 

1. abstract 키워드 - 추상 메소드와 추상 클래스

- 추상메소드는 선언부는 있지만 구현부가 없는 메소드

- 추상 메소드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스로 선언해야 함

- 추상 클래스의 필요 이유

public class Driver {
    public static void main(String[] args) {
    	Animal[] animals = new Animal[3];
        
        animals[0] = new mouse();
        animals[1] = new cat();
        animals[2] =. ew dog();
        
        for (int i = 0; i < animals.length; i++) {
        	anumals[i].cry();
        }
    }
}

public class Mouse extends Animal {
	void cry() {
    	System.out.println("찍!");
    }
}

public class Cat extends Animal {
	void cry() {
    	System.out.println("야옹!");
    }
}

public class Dog extends Animal {
	void cry() {
    	System.out.println("월!");
    }
}

public class Animal {
	void cry() {
    	System.out.println("??");
    }
}

- 이 경우 animal이 cry 하는 것은 이상하다. 누군가 실수로 Animal 클래스의 인스턴스를 만들고 cry()를 호출하면 이상해진다. 이 경우 메소드 선언은 하지만 몸체가 비어있는 추상 메소드를 구현하는 것!

public abstract Animal {
    abstract void cry();
}

- 추상 클래스 특징

(1) 추상 클래스는 인스턴스(객체)를 만들 수 없다. = new를 사용할 수 없다.

(2) 추상 메소드는 하위 클래스에게 메소드의 구현을 강제한다.(오버 라이딩 강제)

(3) 추상 메소드를 포함하는 클래스는 반드시 추상 클래스여야 한다.

 

2. 생성자

- 클래스의 인스턴스

- 객체를 만들 때마다 new 키워드를 사용한다.

- 인자가 없는 생성자는 자바에서 자동으로 생성해준다.(기본 생성자)

- 인자가 있는 생성자를 하나라도 생성하면 기본 생성자는 자동으로 생성되지 않는다.

- 생성자의 정확한 표현은 객체 생성자 메소드

 

3. 클래스 생성 시의 실행 블록, static 블록

- 클래스 생성자는 없다.

- 클래스가 스태틱 영역에 배치될 때 static 블록이 실행된다.

public class Driver {
    public static void main(String[] args) {
    	System.out.println("시작");
        Animal a1 = new Animal();
        Animal a2 = new Animal();
    }
}

public class Animal {
    static {
    	System.out.println("동물!");
    }
}

- Animal 인스턴스를 여러 개 만들어도 Animal 클래스의 static 블록은 한 번만 실행된다.

 

public class Driver {
    public static void main(String[] args) {
    	System.out.println("시작");
        System.out.println(Animal.age);
    }
}

public class Animal {
	static int age = 0;
    
    static {
    	System.out.println("동물!");
    }
}

// 결과
/*
시작
동물!
0
*/

- static 블록이 가장 먼저 실행된다.

- 클래스는 해당 클래스가 코드에서 맨 처음 사용될 때 T메모리의 스태틱 영역에 로딩되며, 이때 단 한번 해당 클래스의 static 블록이 실행된다.

(1) 클래스의 정적 속성을 사용할 때

(2) 클래스의 정적 메소드를 사용할 때

(3) 클래스의 인스턴스를 최초로 만들 때

 

- 이러한 이유는 스태틱 영역도 메모리이기 때문에 실행될 때 바로 스태틱 영역에 로딩하지 않고 최대한 늦게 로딩하기 위함이다.

- 스태틱 영역은 프로그램이 종료되기 전까지 메모리를 반환하지 않는다.

 

728x90

 

4. final과 메소드

- 메소드가 final이면, 오버 라이딩은 금지된다.

 

 

5. interface 키워드와 implements 키워드

- 인터페이스는 public 추상 메소드와 public 정적 상수만 가질 수 있다.

- 인터페이스에서 선언하는 메소드에 public, abstract, static, final을 자동으로 붙여준다.

 

6. this 키워드

- 기억하기

(1) 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수가 우선

(2) 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용

(3) 정적 변수와이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두사로 사용

728x90