자바와 객체지향 - 객체지향 키워드

YUNU·2023년 7월 5일
0

객체지향

목록 보기
6/9
post-thumbnail

📘 자바와 객체지향


🟦 자바의 객체지향 키워드

🔷 abstract - 추상 메서드와 추상 클래스

🔹 추상 메서드

: 선언부 존재, 구현부 없는 메서드

추상 메서드를 하나라도 갖고 있는 클래스라면 Abstract Class로 선언해야 함

  • 추상 클래스는 객체(인스턴스)를 만들 수 없음 --> new 사용 불가
  • 추상 메서드는 하위 클래스에게 메서드의 구현 강요 --> 오버라이딩 강제
  • 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 함

🔷 생성자(객체 생성자 메서드)

클래스의 인스턴스(객체)를 만들 때 마다 new 키워드를 사용

판다 푸바오 = new 판다();

'객체 생성자 메서드'를 줄여서 '생성자'라는 이름으로 더 많이 씀

  • 개발자가 별도의 생성자를 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어 줌
  • 생성자는 개발자가 필요한 만큼 오버로딩해서 만들 수 있음
  • parameter가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들지 않음
	public class 판다 {
    	public 판다(String name) {
        	System.out.println(name);
        }
    }
    
    main문 {
    판다 푸바오 = new 판다();
    }
    // 에러 발생

🔷 static 블록

클래스 생성 시의 실행 블록
클래스가 스태틱 영역에 배치될 때 실행되는 코드 블록

	public class 판다 {
    	static {
        	System.out.println("판다는 멍멍");
        }
    }
    
    main문 {
    System.out.println("실행");
    판다 푸바오 = new 판다();
    }

위의 예시 코드를 실행시키면 "실행", "판다는 멍멍"이 출력된다.

모든 패키지와 클래스가 메모리의 스태틱 영역에 로딩되는 시점
: 해당 패키지 또는 클래스가 처음으로 사용될 때(이 때, 해당 클래스의 static 블록이 단 한번만 실행)

⬇️ 클래스가 처음으로 사용될 때

  • 클래스의 정적 속성을 사용할 때
  • 클래스의 정적 메서드를 사용할 때
  • 클래스의 인스턴스를 최초로 만들 때

🔷 final

객체 지향 언어의 구성 요소인 클래스, 변수, 메서드에 사용 가능

🔹 final class -> 상속 허용 X

하위 클래스를 만들 수 없다.

🔹 final 변수 -> 변경 X, 상수

▪️ final 변수 -> 객체상수
▪️ final static 변수 -> 정적상수
▪️ { final 변수 } -> 지역상수

🔹 final 메서드 -> 오버라이딩 X

	public class 판다 {
    	final void 구른다() {
        	...
        }
    }
    
    class 푸바오 extends 판다 {
    	// 에러 발생 : Cannot override the final method from 판다
        void 구른다() {
        	...
        }
    }

🔷 instanceof 연산자

인스턴스는 클래스를 통해 만들어진 객체

instanceof는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자 (true or false를 반환)
(인터페이스의 구현 관계에서도 동일하게 적용됨)

객체_참조_변수 instanceof 클래스명

객체 참조 변수의 타입이 아닌 실제 객체의 타입에 따라 결과값을 반환함

	class 동물
    class 포유류 extends 동물
    class 판다 extends 포유류
    
    동물 푸바오 new 판다();
    
    푸바오 instanceof 동물 // true
    푸바오 instanceof 포유류 //true
    푸바오 instanceof 판다 //true

🔷 package

네임스페이스를 만들어주는 역할

package 푸바오

package 아이바오

푸바오.대나무 <--> 아이바오.대나무 => 둘은 다름

🔷 interface & implements

인터페이스는 public 추상 메서드와 public 정적 상수만 가질 수 있음

메서드에 public, abstract / 속성에 public, static, final을 붙이지 않아도 자바가 알아서 붙여줌

그러나 lambda로 인해 디폴트 메서드라 하는 객체 구상 메서드와 정적 추상 메서드를 지원 가능

🔹 lambda

자바8부터는 lambda를 통해서만 코드블록을 가질 수 있음, 코드블럭을 변수처럼 사용 가능
(기존에는 코드블록은 반드시 메서드 내에 존재해야만 했음)

표현식
(매개변수) -> {함수로직 (+리턴)}

- 단순한 람다 구문의 경우에는 중괄호 없을 수 있음
- return 없을 수 있음
- 매개변수에 타입 명시 안해도 됨
- 람다식 문법을 컴파일러가 익명 클래스로 변환

🔹 default method

인터페이스가 구현체를 가질 수 있음
-> 기본적인 기능을 탑재한 인터페이스 만들 수 있음
-> 디폴트 메서드를 갖는 인터페이스를 어떤 클래스가 구현하면, 그 클래스에서 인터페이스의 디폴트 메서드를 오버라이딩하지 않아도 기능을 사용할 수 있음

🔹 functional interface

추상 메서드가 오직 하나만 존재하는 인터페이스
(default 메서드나 static 메서드가 있어도 상관 없음)
@FunctionalInterfcae 어노테이션을 붙임

🔹 interface 내의 default method & static method

함수형 인터페이스 등의 도입으로 인터페이스에 body까지 가진 디폴트 메서드와 정적 메서드를 넣을 수 있게 됨

디폴트 메서드와 정적 메서드는 오버라이딩 할 필요 없이 implements해주면 그냥 사용 할 수 있음

//default method

public default 반환형 메서드명(parameter) {
	// ...
}

//static method

public static 반환형 메서드명(parameter) {
	//...
}

🔷 this

객체가 자기 자신을 지칭할 때 쓰는 키워드

  • 지역 변수와 속성(객체변수 or 정적변수)의 이름이 같을 때에는 지역 변수가 우선
  • 객체 변수와 이름이 같은 지역 변수가 있는 경우에 객체 변수를 사용하려면 this.변수명 사용
  • 정적 변수와 이름이 같은 지역 변수가 있는 경우에 정적 변수를 사용하려면 class명.변수명 사용

🔷 super

한 단계 위 상위 클래스의 인스턴스를 지칭하는 키워드

super.super.메소드는 사용 불가

public class 판다 {
    	void 구른다() {
        	...
        }
    }
    
    class 푸바오 extends 판다 {
    	super.구른다();
    }

김종민, '스프링 입문을 위한 자바 객체 지향의 원리와 이해', 위키북스 참고

profile
DDeo99

0개의 댓글