1. 어노테이션
스프링은 IoC(Inversion of Control) 컨테이너 관리권을 가지고 있어 어노테이션을 사용하여 의존성 주입을 한다.
💡 어노테이션이란 ?
- 주석이라는 의미를 가진다.
- 자바 소스 코드에 사이에 @ 기호를 앞에 붙여 사용
💡 어노테이션 용도
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행시(런타임시)특정 기능을 실행하도록 정보를 제공
ex. @override
- 선언한 메서드가 오버라이드 되었다는 것을 나타낸다.
- 상위(부모) 클래스 (또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킨다.
메모리 종류
static 메모리
main 함수가 시작되기 전에 메모리에 떠서 main 함수가 종료될 때 메모리에서 사라진다.
주로 하나 밖에 없는 것 , 무조건 떠 있는 것 , 끝까지 띄우려는 것에 사용
- 무조건 전역 변수이다.
- main이 실행되기 전 뜨기 때문에 타이밍 컨트롤 x (단점)
Stack 메모리
함수 내부에 존재하는 메모리로 생명주기가 짧으며 이를 지역변수라고도 한다.
실행시에 뜬다.
Heap 메모리
method를 new할 때 사용하는 메모리
오버로딩과 오버라이딩
1) 오버로딩(Overloading)
동일한 이름의 method를 타입과 유형만 달리하여 몇 번이고 사용하는 기술

-> attack 메서드의 parameter가 모두 다르다.
2) 오버라이딩(Overriding) : 무효화
부모 클래스와 자식 클래스의 이름이 같을 경우 부모 클래스를 무효화시키는 기술(재정의)

-> 부모 클래스의 sound() 메서드를 자식 클래스인 Cat과 Dog에서 재정의하였다.
Getter & Setter
행위를 통해 상태에 접근하는데 이때 실수 방지를 위해 상태를 private 변수로 잡는다.
일반적인 방법으로 접근할 수 없는 private에 담긴 변수를 확인하기 위한 public 변수를 만들어주는데 이것이 바로 Getter와 Setter이다.

-> 목마름이라는 변수를 Private으로 선언하였기 때문에 접근할 수 없다. 따라서 목마름 변수를 읽어주는 get을 이용한다
인터페이스 , Interface
특정 기능을 개발하는데 있어 공통적인 기능을 명시하고 강제적으로 구현하게끔 하는 역할
다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서 , 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스
오로지 추상 메소드와 상수만 포함
인터페이스 정의

- 인터페이스(interface)라는 키워드를 사용해서 정의
- 접근제어자로 public 또는 default가 명시
- 인터페이스의 변수 값은 "public static final" 키워드가 생략된 상수이므로 주어진 값으로만 사용 가능
- getManufacture과 getOS는 "public abstract" 키워드가 생략된 메소드로 인터페이스를 구현하는 곳에서 오버라이딩을 강제시킨다.
인터페이스 구현


- 인터페이스 구현은 implements 키워드를 통해 일반 클래스에서 인터페이스를 구현
- IPhone 클래스와 Galaxy 클래스는 phone 인터페이스의 규격에 맞게 재정의
인터페이스 상속


- Phone 과 Watch 인터페이스를 상속받은 Device 인터페이스를 생성
- Device 인터페이스를 구현하는 일반 클래스에서 Phone 인터페이스와 Watch 인터페이스에 있는 메소드들은 모두 구현해야만 한다.
인터페이스 기본 메소드 (Default Method)
- 자바 8이전의 인터페이스를 정의할 때는 메소드를 선언할 뿐 내부에서 구현되는 코드 x
- 자바 8이후 default 메소드를 이용하면 인터페이스 내부에서 코드 존재 o
- default 메소드는 오버라이딩이 강제적이 아닌 선택적이다
--> 오버라이딩 안하면 기본 구현된 default 메소드가 실행된다.
- default 키워드는 무조건 명시해야 한다
- 하위호환성을 위해 주로 사용


- Phone 인터페이스에 printRing 이라는 default 메소드를 만들었음
- 인터페이스를 구현하는 클래스에서 선택적으로 오버라이딩을 할 수 있고 Galaxy 클래스에서는 재정의를 , IPhone 클래스에서는 그대로 사용

-> 실행시켜보면 IPhone은 default 메소드가 실행된 것을 볼 수 있다
인터페이스 static 메소드 (자바 8)
- 자바 8이후에 default 메소드와 마찬가지로 static method도 추가되었습니다.
- static method는 인스턴스 생성 없이 인터페이스 이름을 통해서 직접 메소드 호출 가능
- 인터페이스를 구현하는 클래스에서 재정의가 불가


-> printUser() 메소드를 인터페이스 이름을 통해 직접 호출하였음.
인터페이스 private 메소드 (자바 9)
- 코드 구현 시 복잡한 코드를 한 번에 구현하는 것보다 작은 메소드를 작성하여 복잡한 메소드를 구현하는 것이 재사용 , 유지보수 측면에서 효율적
- private 메소드를 이용하여 작은 메소드를 구현하되 외부에서 볼 수 없고 사용할 수 없도록 만드는 메소드


-> pritUser() 메소드와 printRing()메소드에서 private 으로 선언한 작은 메소드를 이용하고 있음 , 한 번에 구현하는 것이 아닌 작은 메소드를 작성하여 그 메소드를 이용
추상 클래스와 인터페이스 비교
-
인터페이스는 특정 기능을 구현하기 위한 필수 규격을 주는 것으로 추상클래스는 미완성 설계도, 인터페이스는 기본 설계도라고 본다
-
모든 클래스를 인터페이스를 사용한다면 공통된 기능을 모두 구현해야 하기 때문에 번거로운 작업입니다. 이럴경우 추상클래스를 이용해야 한다.
-
하지만, 추상클래스만 사용하기에는 다중상속이 불가하기 때문에 각각 다른 추상클래스를 구현하는데 공통된 기능이 존재할 경우는 인터페이스가 필요하다.