Language

Language/Java

OCP 원칙이란?

Open-Closed PrincipleOpen for extension확장에는 열려있되,Closed for modification수정엔 닫혀있어야 한다.  이게 무슨 의미냐.새로운 기능 추가나 변경사항은 자유롭게 할 수 있고,기존의 코드는 건들지 않아도 되는 구조를 말한다. 기존 개발되어 있는 부분에 추가적인 기능을 넣는 나의 업무에 필수적인 원칙이다.강의의 예시 구조 이미지를 발췌해보겠다. 이러한 경우 Driver 클래스의 코드는 수정할 필요가 없다.새로 Car를 추가해야 하거나 Car에 기능을 추가해야할 때도 Driver 클래스의 코드는 수정될 필요가 없다.=> Closed for modification 그저 새로운 Car를 implement하는 클래스를 만들어 실행하면 된다.=> Open for e..

Language/Java

[Java] 동시성 문제, 쓰레드 로컬 ThreadLocal

동시성 문제란 무엇일까? 전역 변수에 대한 수정이 여러 쓰레드에서 일어날 경우 값에 대한 변경이나 조회가 예측할 수 없는 방향으로 흘러가는 것을 말한다. 스프링 빈은 기본적으로 싱글톤으로 등록이 된다. 여러 쓰레드에서 하나의 빈에 대해 동시에 접근할 경우에도 동시성 문제가 발생한다. 예를 보자. Thread A에서 어떠한 로직으로 nameStore라는 전역 변수에 userA라는 이름을 저장한다. 이후 바로 Thread B에서 같은 로직으로 nameStore라는 전역 변수에 바로 접근해 userB라는 이름을 저장한다. 이 경우 각 쓰레드가 nameStore라는 전역 변수를 조회하게 되면 어떤 값이 조회될까? 당연히 userB라고 조회가 될 것이다. Thread A는 userA를 예상했지만 userB는 예상..

Language/Java

Java 필수 - 멀티쓰레드와 동기화 (feat. Atomic, Synchronized, Volatile)

공유자원이란? 여러 쓰레드가 동시에 접근할 수 있는 자원을 의미한다. 임계영역이란? 공유자원들 중 여러 쓰레드가 동시에 접근했을 때 문제(경쟁상태)가 생길 수 있는 부분을 말한다. 공유자원 ) 임계영역 경쟁상태란? 둘 이상의 쓰레드가 공유자원을 병행적으로 읽거나 쓰는 동작을 할 때 타이밍이나 접근 순서에 따라 실행 결과가 달라지는 상황이다. 문제 상황 예시) Read - Modify - Write Thread 1) count = 0 [read] -> count = 1 [modify] -> count = 1 [write] Thread 2) --------------------- -> count = 0 [read] -> count = 1 [modify] -> count = 1 [write] 이러한 상황에서 ..

Language/Java

Java 기본 - Wrapper Class 래퍼 클래스

Wrapper Class란? 기본 자료형에 대한 클래스 표현이다. Primitive VS Wrapper Primitive는 기본 자료형을 의미한다. int, long, float, boolean과 같이 맨 앞의 이니셜이 소문자인 자료형이다. 초기화될 때에 0이나 false같이 유의미한 값으로 초기화된다. Wrapper는 영어의 의미대로 객체로 한번 감싼 자료형이다. int -> Integer, long -> Long처럼 맨 앞의 이니셜이 대문자인 자료형이다. 초기화될 때에 null로 빈객체로 초기화된다. Wrapper Class를 사용하는 이유 실제로 프로젝트를 진행 중에도 궁금했던 점이다. JPA @Id에 Long을 쓴 이유 김영한님의 강의를 보면 항상 @Id값에 @GeneratedValue를 해 au..

Language/Java

Java 기본 - 접근자

접근자는 변수 또는 메소드의 접근 범위를 설정해주기 위해 사용하는 Java의 예약어를 의미한다. 종류는 아래와 같이 4가지가 있다. public 어떤 클래스에서라도 접근 가능 protected 클래스가 들어있는 패키지 내 + 클래스를 상속받은 클래스(패키지 외부 포함) 접근 가능 default 클래스가 들어있는 패키지 내에서만 접근 가능 private 클래스 내부에서만 접근 가능 public > protected > default > private 순서로 범위가 작아진다.

Language/Java

Java 기본 - 오버라이딩 오버로딩

오버라이딩과 오버로딩 둘 다 같은(중복된) 이름의 메소드에 대한 기능이다. 오버라이딩이란 부모 클래스/인터페이스에 존재하는 메소드를 자식 메소드에서 필요에 맞게 재정의하는 것을 말한다. 동적바인딩 된다는 특징이 있다. 동적바인딩이란? 런타임에 호출될 함수가 결정되는 것이다. interface Parent { public void method(); } class Child extends Parent { @Override public void method() { logic(); } } 해당 경우 Child에서 method()를 호출했을 때, Parent 클래스에 있는 method가 아닌 override된 Child 내의 메소드 로직이 실행된다. 오버로딩이란 같은 이름의 메소드지만 매개변수의 타입이 다르거나 ..

Language/Java

Java 기본 - final 키워드

클래스 + final = 다른 클래스에서 상속하지 못한다. 메소드 + final = 다른 메소드에서 오버라이딩 하지 못한다. 변수 + final = 변하지 않는 상수값이 되어 새로 할당할 수 없는 변수가 된다. finally - 코드 블록 try-catch 또는 try-catch-resource 구문에서 정상적으로 작업을 한 경우(try)와 에러가 발생했을 경우(catch)를 포함해 마무리해줘야하는 작업이 존재하는 경우 작성해주는 코드 블록이다. 점유하고 있는 리소스를 해제하는 등 마무리에서 꼭 실행해줘야하는 코드가 포함된다. finalize() - 메소드 GC에 의해 호출되는 함수로 절대 호출하면 안되는 함수이다. Object 클래스에 정의되어 있다. GC의 발생시점은 규칙적이지 않기에 해당 메소드가 ..

Language/Java

Java 기본 - 제네릭 Generic

제네릭은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법이다. List list = new ArrayList(); 가 있으면 제네릭이다. 안에 String이 들어가 있기 때문에 앞으로 list라는 변수에는 String타입만 저장이 가능하다. 객체의 타입을 지정해주는 것이다. 제네릭의 장점 재사용성 증가 여러 타입의 파라미터를 삽입해 객체를 생성할 수 있어 코드가 간결해지고 재사용성이 높아진다. 동일한 기능을 하는 메서드에서 파라미터 타입만 다르게 사용하는 경우 유용하다. 컴파일 시 타입 에러를 발견 가능 기존에 JDK 1.5 이전에는 인수, 반환값으로 Object타입을 사용해 사용할 때 타입 변환을 새로 해주어야 했다. 현재는 그 과정없이 컴파일 단계에서 타입 오류를 잡아낼 수 있다. 컴파일..

레이튼
'Language' 카테고리의 글 목록