데브코스 W2D1

코끼릭·2022년 3월 21일
0

TIL

목록 보기
1/36

JAVA 개발환경

JRE: 자바 실행 환경
JDK: 자바 실행과 개발을 할 수 있는 환경

JVM

  • 자바 컴파일러가 변환시킨 Byte Code를 실행환경에 맞게 실행할 수 있도록 해석해주는 역할을 수행한다.
  • 가비지 콜렉터라는 메모리 관리 기능을 통해 힙 영역의 객체들을 자동으로 관리하는 역할을 수행한다.
  • 한정된 메모리를 효율적으로 관리해 최적의 성능을 이끌어 낼 수 있다.
  • JVM의 힙은 생성된 시간에 따라 Young Generation, Old Generation, Permanent Generation으로 구분된다.

Reference와 Primitive

자바는 8개의 데이터 타입(boolean, byte, short, int, long, float, double, char)을 제외한 나머지는 모두 객체로 객체형 데이터로 객체형 데이터는 모두 힙 메모리에서 생성되서 관리된다. 객체형 데이터의 기본값은 NULL값이고 매개변수로 객체형이 전달된 경우 Call by Reference라는 방식으로 동일한 데이터 위치에 대한 값의 접근이 가능하다. 반면에 8개의 기본형 데이터의 경우 Call by Value라는 방식으로 매개변수가 전달되고 새로운 데이터가 할당되어 동일한 값만 저장되는 형태이기 때문에 서로 다른 데이터 위치에 접근하는 상황이다. 따라서 사용에 유의하여 동일한 데이터에 접근하는 과정을 의도한 경우 Wrapper Class를 사용해야 된다.

StringBuffer VS StringBuilder

자바의 경우 String 한 번 값이 결정되면 값을 변경할 수 없는 immutable하기 때문에 +연산을 수행할 때마다 Constant Pool에 새로운 String객체가 생성되기 때문에 StringBuffer 객체를 생성한 후 append연산을 통해 mutable하게 사용이 가능하지만 일반 String보다 메모리 사용량이 많고 속도도 느리기 때문에 변경이 많은 경우에만 사용을 하는 것이 유리하다.

StringBuffer와 비슷한 StringBuilder의 경우 동일한 사용방법이지만 성능이 우수하기 때문에 멀티 스레드 환경에서 안전성을 고려해야 되는 경우에는 StringBuffer를 사용하고 동기화를 고려할 필요가 없는 상황에서는 StringBuilder를 사용하는 것이 유리하다.

Constant Pool

String Literal로 생성을 하게되면 Constant Pool에 생성이 되고 동일한 문자열을 생성한 경우 데이터를 재사용하기 때문에 메모리 절약이 되지만 new를 이용한 생성은 동일한 문자열이어도 각자 다른 힙 메모리에 할당이 된다.

String s1 = "hello";
String s2 = "hello";

String s3 = new String("hello");
String s3 = new String("hello");

s1 == s2; //동일한 데이터 주소를 가르키기 때문에 true
s3 == s4; //서로 다른 힙데이터에 할당되기 때문에 false

Object

자바 객체의 최상위 객체로 모든 객체들이 상속하고 있어 아래의 메소드 역시 모든 객체가 호출이 가능하다.

  • toString() : 객체를 문자열로 표현한 값이 나오고 기본적인 메소드를 사용하면 "클래스명@16진수해시코드"로 구성된 문자열을 리턴한다. (System.out.prinIn()메소드에서 primitive 데이터가 아닌 객체가 매개변수인 경우 해당 메소드의 리턴값을 받아서 출력)
  • equals() : 저장하고 있는 데이터가 동일한 즉 논리적으로 동등한 상태인 지 확인하는 메소드이다.(String의 경우 문자열 비교로 오버라이딩되어 있는 형태)
  • hashCode() : Runtime 중인 객체의 힙메모리 주소를 이용해 해시코드를 만들어서 반환하는데 이 값은 각 객체마다 다른 값을 가지고 있는 고유한 값이다.

equals()와 hashCode()의 관계

  • 동일성이 만족하면 동등성이 만족해야 하지만 동등성이 만족하면 동일성이 만족해야 하는 건 아니다.
  • 두 객체가 equals()에 의해 동일하지 않다면, 두 객체의 hashCode() 값은 일치하지 않아도 된다
  • 두 객체가 equals()에 의해 동일하다면, 두 객체의 hashCode() 값도 일치해야 한다.
  • HashMap의 키 객체의 중복 여부를 확인하기 위해 hashCode와 equals를 사용하기 때문에 사용자 정의 객체를 키로 사용하기 위해서는 equals와 hashCode를 오버라이딩해야 한다.

참조 링크

profile
ㅇㅅㅇ

0개의 댓글