본문 바로가기

반응형

Programming/Java

(22)
[Java] synchronized 멀티 스레딩 환경에서 여러 프로세스/스레드가 동시에 같은 데이터에 접근할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황을 경합 조건(race condition) 이라고 합니다. 경합 조건 상태에서 애플리케이션을 개발하면 의도하지 않은 결과 출력 또는 버그가 발생할 수 있습니다. 경합 조건을 방지하고 여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것을 동기화(synchronization)라고 합니다. Java에서는 synchronized 키워드를 사용해서 동기화를 구현합니다. 이 키워드를 사용하면 synchronized 블럭이 생성되는데, 이는 한 번에 하나의 스레드만 허용한다는 의미를 가집니다. 먼저 경합 조건이 어떻게 발생하는지 알아봅시다. import java...
[Java] private static final VS private final private static final static 키워드로 생성된 변수는 해당 변수가 있는 클래스 로드 중에 초기화되며, 애플리케이션 실행 내내 메모리에 머물러 있다. 따라서 초기화 과정 없이 해당 변수, 메소드에 접근할 수 있다. non-static(static 키워드 없이 생성된) 변수는 새로운 객체를 생성할 때마다 초기화된다. 자바 코드 컨벤션에 따르면 static final 변수 이름은 대문자(uppercase)로 작성되어야 한다. 아래 코드는 static final 키워드로 임의의 난수를 생성하는 변수를 생성했다. 그리고 해당 변수를 가진 클래스 인스턴스를 세 개 생성하여 static final 키워드가 붙은 변수인 경우 어떤 값을 출력하는지 알아보았다. 출력 결과 서로 다른 인스턴스를 생성하여..
[Java] 자바 클래스 파일(.class) 자바 클래스 파일 자바 소스 코드로 작성된 .java 파일이 컴파일러에 의해 컴파일 되면 .class 확장자를 가지고 있는 자바 클래스 파일이 생성된다. 자바 클래스 파일은 .java 파일에 정의된 클래스 개수에 따라 하나 혹은 여러 개가 생성될 수 있다. 자바 클래스 파일은 바이트 코드로 구성되어 있다. 이 바이트 코드는 JVM이 이해할 수 있는 명령어이다. 그리고 바이트 코드 안에는 Windows 또는 Mac과 같은 특정 구현 환경에 맞는 머신 레벨 명령어로 변환하는 코드가 포함되어 있다. 자바 바이트 코드는 JVM이 이해할 수 있도록 설계되었다. 그리고 플랫폼 의존적인 코드가 없다. 따라서 JVM이 설치된 장비라면 CPU나 운영체제가 다르더라도 자바 프로그램을 실행할 수 있다. JVM을 중간에 두고..
[Java] JDK와 JRE의 차이점 JDK JDK(Java Development Kit)는 자바 애플리케이션이나 기타 응용 프로그램 개발에 필요한 개발 환경이다. 개발자는 사용 환경(Window, Mac, Unix 등)에 따라 요구사항에 맞게 JDK를 설치하여 개발을 하면 된다. JDK는 JRE(Java Runtime Environment) 그리고 interpreter, compiler, archiver, debugger와 같은 다양한 개발 도구를 지원한다. JDK는 개발 작업만 수행할 수 있는 것이 아니다. JDK가 있으면 개발된 프로그램 실행 또한 가능하다. JRE JRE는 JVM(Java Virtual Machine)을 구현한 것으로 자바 프로그램을 실행할 수 있는 환경을 제공하는 것에 중점을 두고 있다. JRE는 compiler, ..
[Java] 코드로 이해하는 Heap과 Stack의 동작 Heap과 Stack이 구체적으로 코드에서 어떻게 관리되는지 알아본다. Stack은 무엇인가요? Stack 영역은 스레드당 하나씩 할당이 된다. 스레드가 새롭게 생성되면 해당 스레드에 해당하는 Stack 영역도 새로 생성이 된다. 다른 스레드의 Stack 영역에는 접근 할 수 없다. Stack의 데이터는 LIFO(Last In First Out_선입후출) 형태로 관리된다. 값을 쌓고(push), 값의 쓰임이 종료되면 제거(pop)한다. 원시 타입의 데이터가 값과 함께 할당(int, boolan, double 등의 실제 값이 스택에 할당) 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다. 메소드를 호출할 때마다 스택 영역이 생성되고, 기본 타입 변수나 참조 타입 변수가 쌓이..
[Java] toString() 메소드는 왜? toString() 메소드는 왜 사용할까? 다른 사람이 구현한 코드를 보면 클래스에 toString() 메소드를 재정의한 형태를 볼 수 있다. 이는 다음과 같은 궁금증을 유발한다. 왜 저렇게 했을까? 저렇게 하는것이 규칙인가? 잘 모르겠고 그냥 저렇게 하는가 보다 생각하자! 첫 번째와 두 번째는 갱생의 여지가 있지만, 세 번째의 경우 갱생의 여지(발전의 기회)가 거의 없는 상황이다. 앎의 과정은 고통스럽다. 하지만 알아야 한다는 사실을 알고도 이를 무시하고 시간을 보낸다면 언젠가 게으름에 대한 대가를 치르게 된다. 무지의 고통에서 벗어나야 한다. 제발.(본인에게 하는 말입니다.) 이런 삶에서 벗어나야 한다.. toString() 메소드 소개 Object는 모든 클래스의 부모 클래스이다. 개발자가 생성한 ..
[Java] DTO / VO DTO(Data Transfer Object) 계층(Layer)간 데이터 교환을 위해 사용하는 객체. 데이터 교환 목적으로 사용하므로 로직을 가지지 않는다. getter/setter 메소드만 가진다. 데이터를 담고, 필요 시 꺼내어 사용하는 용도로만 사용되는 것이 DTO class Member { private String name; private int age; public Member(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public String setName(String name) { this.name = name; } ... } VO(Value Object..
[Java] 매개변수의 다형성 자동 타입 변환(Promotion)은 부모 타입에 모든 자식 객체가 대입되어 사용할 수 있다는 것이다. 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다. 자동 타입 변환은 메소드 구현 상황에서 자주 발생한다. 메소드 호출 시 매개 변수의 타입과 동일한 매개 값을 지정하는 일반적인 방법에서 벗어나 매개 변수에 자식 타입 객체를 지정할 수 있다면 매개 값을 다양화할 수 있다. 매개 변수의 타입이 클래스인 경우, 해당 클래스의 객체 뿐만이 아니라 자식 객체까지도 매개 값으로 사용할 수 있다. 매개 값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과가 다양해진다. 자식 객체가 부모 클래스의 메소드를 오버라이딩했다면 메소드 내부에서 오버라이딩된 메소드를 호출하여 메소드 실행..

반응형