✍️SOLID 원칙
SRP 단일 책임 원칙
OCP 개방-폐쇄 원칙
✅ 확장은 열려있고, 변경은 닫혀 있다.
LSP 리스코프 치환 원칙
ISP 인터페이스 분리 원치
DIP 의존관계 역전 원칙
✅ 클라이언트 클래스가 구현 클래스가 아닌 인터페이스를 바라보도록 해야한다.
-> 이 MemberService 클라이언트는 인터페이스와 구현 클래스에도 동시에 의존해서 문제가 생긴다.
💡 의존한다는 것 : 현재 구현한 클래스를 알고 있다는것
- 리터럴 사용한 방식
- new 연산자 이용한 방식
변수 선언시 new 키워드를 사용하는 것과 그냥 선언하는 것의 차이는 무엇일까요 ?
✍️ new 연산자 VS Literal 방식
a=10
일때 10이라는 것은 변하지 않는 고정적인 값으로, 리터럴이라고 부름new 키워드 사용하기
String one = new String("example");
String two = new String("example");
리터럴 방식 사용
String one = "apple";
String two = "apple";
-> 이렇게 new
를 사용하게 되면 one과 two는 다른 주소를 할당 받고, 리터럴 방식
을 사용한 경우, 두 변수의 메모리 주소 값이 동일하게 나온다.
위의 변수 할당 방식에 따라 데이터 비교 방식과 결과가 달라진다.
public class cmp {
public static void main(String[] args) {
String str1 = "hyeons";
String str2 = new String("hyeons");
if(str1 == str2) {
System.out.println("두개의 값이 같음.");
} else {
System.out.println("두개의 값이 같지 않음.");
}
if(str1.equals(str2)) {
System.out.println("두개의 값이 같음.");
} else {
System.out.println("두개의 값이 같지 않음.");
}
}
}
✍️ this, this() 차이
참조 변수
실제 값을 가진 변수가 아닌, 값이 들어가 있는 주소를 가지고 있는 변수임.
참조변수는 메모리 공간이 stack, heap에 존재
Myclass class = new Myclass()
에서 class 참조 변수로서, stack 공간에 저장된다. 그리고 참조 변수의 주소값을 따라가서 heap 공간에 있는 MyClass()를 찾아가게 된다.
참조변수 class는 주소값을 저장한다 생각 !
public class ConvenienceStore {
// 편의점 브랜드
String brand;
// 편의점 주소
String address;
// 직원 수
int staffCount;
// 편의점 사장
String boss;
public ConvenienceStore(String brand, String address, int staffCount, String boss) {
this.brand = brand;
this.address = address;
this.staffCount = staffCount;
this.boss = boss;
}
}
this는 생성자의 매개변수와 인스턴스 변수가 같을 때 구분하기 위해 사용한다.
this.brand가 인스턴스 변수, brand가 매개변수로 정의된 지역변수
static 메서드는 this 사용 못한다.
this()는 같은 클래스의 다른 생성자를 호출할 때 사용한다.
public class ConvenienceStore {
// 편의점 브랜드
String brand;
// 편의점 주소
String address;
// 직원 수
int staffCount;
// 편의점 사장
String boss;
// this() 생성자로 다른 생성자를 호출한다.
ConvenienceStore() {
this("GS", "몰라", 1, "현정");
}
public ConvenienceStore(String brand, String address, int staffCount, String boss) {
this.brand = brand;
this.address = address;
this.staffCount = staffCount;
this.boss = boss;
}
}
✍️ final, static, static final 차이
Static
final
해당 변수는 값이 저장되면 수정이 불가능하다는 의미다.
public class Shop{
final int closeTime = 22;
final int openTime;
public Shop(int openTime){
this.openTime = openTime;
}
}
closeTime처럼 선언과 동시에 값주는 방식
openTime처럼 같이 생성하고, 객체 생성시 값을 주는 방법이 있다. 이러한 경우는 값은 변하지 않지만, 객체마다 다르게 설정이 가능함
static final
=> static + final = "고정된 + 최종적인", 상수를 선언하고자 할 때 사용한다.
static final
을 통해 상수 선언한다.정리
- static : 공용으로 사용하는 필드, 객체마다 가질필요 없다.
- final : 한 번 값 정해지고 나면, 값 바꿀 수 없는 필드
- static final : 모든 영역에서 고정된 값으로 사용하는 상수
✍️ super, super() 차이
공통점
✍️ 자바 원시 타입, 참조 타입
✍️ 스프링 핵심 키워드
POJO 프로그래밍 지향
자바의 객체지향적인 특징을 살려 비즈니스 로직에 충실한 개발이 가능하도록 하는 것
IoC/DI
AOP
PSA
✍️ spring 동작 과정