[JAVA] 개념 정리 2

NaSC·2022년 12월 11일
0

JAVA 기본개념

목록 보기
2/6

1. 전역변수 , 인스턴스변수, 지역변수, static 변수

  • 전역변수 ( 생성하고 초기화안해도 자바가 알아서해줌 )

    • static 변수 (클래스변수)

      객체생성을 하지 않아도 사용 가능, 객체생성을 여러번하여도 하나의 저장 공간을 가짐

    • 인스턴스변수

      객체생성을 해야만 사용 가능, 객체생성을 할때마다 서로 다른 저장공간을 가짐

  • 지역변수 ( 생성하고 초기화 해줘야함 )

    • 메소드안에 생성되고, 메소드가 호출될때 생성됬다가 메소드가 끝나면 같이 사라짐.

2. 깊은복사 vs 얇은 복사

  • 깊은복사는 실제값을 새로운 메모리공간에 복사 -

    ( 서로다른객체를 참조하기 때문에 원본의 변경이 복사본에 영향을 미치지않음. )

얇은복사는 참조값만 복사 ( clone ) -

( 같은객체를 공유해서, 원본을 변경하면 복사본도 영향을 받음. )

3. 싱글톤패턴

최초 한번만 메모리 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴,

인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 때 사용

커넥션풀, 스레드풀, 디바이스설정 객체 같은 경우에 사용

외부에서 new를 통해 객체생성못하게막음.

public class CarClass
 
prviate CarClass(){}
 
private static CarClass car = new CarClass();
 
public static CarClass getInstance() { return car; }

참고 https://devmoony.tistory.com/43

4. Array vs ArrayList

Array
크기가 정해져있고, 주로 검색하는데 사용 ( 데이터 추가/삭제가 비효율적)

데이터 삭제 시 빈공간으로 둠 (정적)

ArrayList
크기가 정해져있지않고, 데이터 추가/삭제가 빈번할 때 사용

데이터 삭제 시 메모리의 빈틈을 두지않음 (동적)

5. 자바 컴파일과정

a. 개발자가 소스코드 작성 (.java)
b. build
c. java compliler의 javac의 명령어를 통해 바이트코드(.class)를 생성
d. class loader를 통해 jvm내로 로드
e. 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석되어(각 운영체제에 맞는 기계어)Runtime Data Area에 배치

6. 접근 제어지시자

private > default > protected > public 순으로 보다 많은 접근을 허용

접근제어자외부 패키지상속관계외부클래스동일클래스
publicOOOO
protectedXOOO
defaultXXOO
privateXXXO

7. 메서드 템플릿패턴(추상클래스) vs 전략패턴(인터페이스)

메서드 템플릿 패턴 (추상클래스) 카톡,SMS발송

  • 공통적인것을 묶을 때 용이함 ( 코드 재사용 , 중복코드 제거 )

전략패턴 (인터페이스)

  • 확장을 고려하기 용이함

8. new vs 상수풀

  • String name = “a”
    이라는 코드에서 name은 상수풀 내의 “a”의 주소값을 가리키게 된다.
    그럼 name2 = “a” 이라고 선언해도 같은 값의 주소를 가리키기 때문에 하나의 메모리를 재사용할 수 있다. < String literal 방식 >
    반면, String name = new String(”a”);
    이라는 코드는 new연산자를 통해 객체를 생성했기 때문에 상수풀에 해당값이 있더라도 Heap 영역 내 별도의 메모리를 할당하여 주소를 가리키게된다.

9. 불변객체

Java에서 Class의 인스턴스가 생성된 이후에 내부 상태를 변경할 수 없는 객체.
String은 불변객체이다. String이 가변객체라면 상수풀을 사용할 수 없다.
String이 가변객체라면 String name1 = “a” ; String name2 = “a”; 이라는 코드가 있다고 하면 name1 = “사람” 으로 바꿔버리는 순간 name2가 가리키는 값은 더이상 “a”이 아닌 “사람”이된다. 따라서 상수풀의 재활용성을 이용하기위해 String은 불변객체로 설계해야한다.

10. String vs SpringBuilder vs StringBuffer

String
불변 객체이므로 + 연산으로 문자열을 이어 붙이려고 해도 매번 새로운 객체를 할당해야 한다. 하지만, StringBuilder, StringBuffer는 가변 객체이고 내부 char[] 배열의 사이즈를 조절하여 문자열을 이어 붙이기 때문에 새로운 객체를 최소로 할당할 수 있다.

String : 문자열 연산이 적고 멀티스레드 환경일 경우 사용, thread safe
StringBuffer : 동기화키워드(synchronized) 를 지원해서 멀티쓰레드 환경에서 안전하다.
StringBuilder : 동기화를 지원하지않지만 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.

String, StringBuffer는 thread-safe 보장
StringBuilder는 thread불안전

11. 동기화

두개의 쓰레드가 동시에 하나의 리소스에 접근할 때 순서를 맞춰서 데이터에 오류가 발생하지 않도록 하는 것

12. thread safe

멀티스레드 환경에서 여러 스레드가 동시에 접근해도 프로그램 실행에 문제가 없는 특징 혹은 상태. 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도, 각 스레드에서의 함수의 수행결과가 올바로 나오는 상태

13. thread safe를 지키기위한 방법

a. Re-entrancy

  • 어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야한다.

b. Thread-local storage

  • 공유자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써
    동시 접근을 막는다.
    동기화방법과 관련되어있고, 공유상태를 피할 수 없을 때 사용

c. Mutual exclusion

  • thread에 lock이나 seamaphore를 걸어서 공유자원에는 하나의 thread만 접근 가능하게 한다.

d. Atomic operations

  • 데이터 변경 시 atomic하게 데이터에 접근하도록 만든다.

e. immutable Object

  • 객체 생성 이후에 값을 변경할 수 없도록 만든다.
profile
데이터엔지니어 😘

0개의 댓글