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

JHJeong·2024년 5월 15일
0

객체지향 원리

목록 보기
3/5
post-custom-banner

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

  • 선언부는 있는데 구현부가 없는 메서드를 말한다.
  • 추상 메서드(Abstract Class)를 가지고 있는 클래스는 반드시 추상 클래스로 선언해야한다.( 추상 메서드가 없어도 추상 클래스로 선언은 가능)
  • 왜 이런 추상 클래스가 필요로 할까??
public class Driver {
	public static void main(String[] args) {
		동물[] 동물들 =  new 동물[5];
		
		동물들[0] = new 쥐();
		동물들[1] = new 고양이();
		동물들[2] = new 강아지();
		동물들[3] = new 송아지();
		동물들[4] = new 병아리();

		for( int i = 0; i < 동물들.length; i++ ) {
			동물들[i].울어보세요();
		}
	}
}

class 쥐 extends 동물 {
	void 울어보세요() {
		System.out.println("나는 쥐! 찍! 찍!");
	}
}
class 고양이 extends 동물 {
	void 울어보세요() {
		System.out.println("나는 고양이! 야옹! 야옹!");
	}
}
class 병아리 extends 동물 {
	void 울어보세요() {
		System.out.println("나는 병아리! 삐약! 삐약!");
	}
}
class 동물 {
	void 울어보세요() {
		System.out.println("나는 동물!  어떻게 울까?" );
	}
}

위 소스를 보면 동물 클래스의 인스턴스는 어떻게 울어야 하는걸까? "동물"클래스의 인스턴스가 울게 하는 게 논리적으로 말이 되지 않는다. 그렇다고 해당 함수의 몸체를 비워두는 것도 이상하다. 바로 이런 경우에 추상 메서드를 사용하게 된다. 메서드 선언은 있으되 몸체는 없는 형태로 메서드를 구현하는 것이다.( 누군가 동물 객체를 만들고 울어보세요() 메서드를 호출하는 것도 퍽 난감하다. )

abstract class 동물 {
	abstract void 울어보세요();
}

위와 같은 식으로 하면 해결된다.

  • 추상 클래스는 인스턴스, 즉, 객체를 만들 수 없다. 즉 new를 사용할 수 없다.
  • 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. 오버라이딩 강제
  • 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.

2. 생성자

  • 클래스의 인스턴스, 즉 객체를 만들 때 마다 new 키워드를 사용한다.
  • 반환 값이 없고 클래스 명과 같은 이름을 가진 메서드를 객체를 생성하는 메서드라고 해서 객체 생성자 메서드라고 한다.
  • 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.
  • 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.

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

  • 클래스 생성자는 존재하지 않는다. 그러나 클래스가 스태틱 영역에 배치될 때 실행되는 코드 블록이 있다. ( static 블록 )
  • static 블록에서 사용할 수 있는 속성과 메서드는 static 멤버 밖에 없다.(객체 멤버에 접근할 방법이 없기 때문에)
public class Driver05 {
	public static void main(String[] args) {
		System.out.println("main 메서드 시작");
		System.out.println(Animal.age);
	}
}

class Animal {
	static int age = 0;
	static {
		System.out.println("Animal class ready on!");
	}
}

출력 결과

main 메서드 시작
Animal class ready on!
0

위 소스를 실행하면 클래스가 맨 처음 사용될 때 메모리의 스태틱 영역에 로딩되며, 이 때 단 한번 해당 클래스의 static 블록이 실행되기 때문에 Animal class ready on! 이 출력되었다.
여기서 클래스가 제일 처음 사용될 때는 아래 세가지 중 하나이다.
(1) 클래스의 정적 속성을 사용할 때
(2) 클래스의 정적 메소드를 사용할 때
(3) 클래스의 인스턴스를 최초로 만들 때

  • 왜? 실행될 때 로딩하지 않고 사용할때 로딩하게 될까? 그 이유는 static 영역도 메모리이기 때문이다. 메모리는 최대한 늦게 사용을 하고 최대한 빨리 반환하는 것이 정석이기 때문이다.

4. final 키워드

  • 마지막, 최종이라는 의미를 가진 단어로, final 키워드가 사용되는 곳은 클래스, 변수, 메서드 딱 3군데에서 사용될 수 있다.
    (1) final class : 상속을 하지 않겠다는 의미
    (2) final 변수 : 변경 불가능한 상수가 됨
    (3) final 메서드 : 재정의, 즉 오버라이딩을 금지하는 함수가 됨
  1. instanceof 연산자
  • 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자이다.
  • instanceof 연산자가 강력하긴 하지만 객체 지향 설계 5원칙 중 LSP(리스코프 치환 원칙)를 어기는 코드에서 주로 나타나는 연산자이기 때문에, 해당 연산자를 보면 리팩토링의 대상이 아닌지 확인해야한다.
  • instanceof 연산자는 클래스의 상속 관계 뿐만 아니라 인터페이스의 구현 관계에서도 동일하게 적용된다.
class 동물 {
}

class 조류 extends 동물 {
}

interface 날수있는 {
}

class 박쥐 implements 날수있는 {
}

public class Driver {
	public static void(String[] args) {
		동물 동물객체 = new 동물();
		동물 조류객체 = new 조류();

		System.out.println(동물객체 instanceof 동물 );
		System.out.println(조류객체 instanceof 동물 );
		System.out.println(조류객체 instanceof 조류 );

		날수있는 박쥐객체 = new 박쥐();
		
		System.out.println(박쥐객체 instanceof 날수있는);
		System.out.println(박쥐객체 instanceof 박쥐);

	}
}

출력결과

true
true
true
true
true

6. interface 키워드와 implements 키워드

  • 인터페이스는 public 추상 메서드와 public 정적 상수만 가질 수 있다.
  • 인터페이스는 추상 메서드와 정적 상수만 가질 수 있기에 따로 메서드에 public과 abstract, 속성에 public 과 static, final을 붙이지 않아도 자동으로 자바가 알아서 붙여준다.

7. this 키워드

  • 객체가 자기 자신을 지칭할 때 쓰는 키워드이다.
  • 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수가 우선한다.
  • 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this 키워드를 사용한다.
  • 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두어로 사용한다.

8. super 키워드

  • 단일 상속만을 지원하는 자바에서 super는 바로 상위 클래스의 인스턴스를 지칭하는 키워드이다.
profile
이것저것하고 싶은 개발자
post-custom-banner

0개의 댓글