데브코스 W2D1 TIL
백엔드 데브 코스 중 중요한 개념을 정리하거나 과제 개발 일지를 정리한 공간입니다.
1. JAVA 개발환경
JRE: 자바 실행 환경
JDK: 자바 실행과 개발을 할 수 있는 환경
JVM
- 자바 컴파일러가 변환시킨 Byte Code를 실행환경에 맞게 실행할 수 있도록 해석해주는 역할을 수행한다.
- 가비지 콜렉터라는 메모리 관리 기능을 통해 힙 영역의 객체들을 자동으로 관리하는 역할을 수행한다.
- 한정된 메모리를 효율적으로 관리해 최적의 성능을 이끌어 낼 수 있다.
- JVM의 힙은 생성된 시간에 따라 Young Generation, Old Generation, Permanent Generation으로 구분된다.
2. Reference와 Primitive
자바는 8개의 데이터 타입(boolean, byte, short, int, long, float, double, char)을 제외한 나머지는 모두 객체로 객체형 데이터로 객체형 데이터는 모두 힙 메모리에서 생성되서 관리된다. 객체형 데이터의 기본값은 NULL값이고 매개변수로 객체형이 전달된 경우 Call by Reference라는 방식으로 동일한 데이터 위치에 대한 값의 접근이 가능하다. 반면에 8개의 기본형 데이터의 경우 Call by Value라는 방식으로 매개변수가 전달되고 새로운 데이터가 할당되어 동일한 값만 저장되는 형태이기 때문에 서로 다른 데이터 위치에 접근하는 상황이다. 따라서 사용에 유의하여 동일한 데이터에 접근하는 과정을 의도한 경우 Wrapper Class를 사용해야 된다.
3. 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
4. Object
자바 객체의 최상위 객체로 모든 객체들이 상속하고 있어 아래의 메소드 역시 모든 객체가 호출이 가능하다.
- toString() : 객체를 문자열로 표현한 값이 나오고 기본적인 메소드를 사용하면 "클래스명@16진수해시코드"로 구성된 문자열을 리턴한다. (System.out.prinIn()메소드에서 primitive 데이터가 아닌 객체가 매개변수인 경우 해당 메소드의 리턴값을 받아서 출력)
- equals() : 저장하고 있는 데이터가 동일한 즉 논리적으로 동등한 상태인 지 확인하는 메소드이다.(String의 경우 문자열 비교로 오버라이딩되어 있는 형태)
- hashCode() : Runtime 중인 객체의 힙메모리 주소를 이용해 해시코드를 만들어서 반환하는데 이 값은 각 객체마다 다른 값을 가지고 있는 고유한 값이다.
+ equals()와 hashCode()의 관계
- 두 객체가 equals()에 의해 동일하다면, 두 객체의 hashCode() 값도 일치해야 한다.
- 논리적으로 동일한 상태를 확인하기 위한 객체 메소드를 오버라이딩할 때는 equals와 hashCode를 모두 오버라이딩 해야 한다. (Hash 자료구조의 저장에서 고유한 키값 확인에서 hashCode를 사용하기 때문이다.)
- 두 객체가 equals()에 의해 동일하지 않다면, 두 객체의 hashCode() 값은 일치하지 않아도 된다
5. 계산기 프로젝트 개발 일지
일단 Intellij 개발 환경 세팅을 시작했고 프로젝트에 기능에 필요한 알고리즘 설계를 하는 중이다. 본격적인 코드 작성은 내일 시작할 예정이다. 더하기, 빼기 연산보다 곱하기, 나누기 연산이 우선이기 때문에 우선인 연산이 나온 경우에는 바로 2개의 피연산자에 대한 연산을 수행시켜서 나온 값을 새로운 피연산자로 업데이트 해주고 나온 값들을 차례대로 더하기나 빼기 연산을 수행하는 방식으로 설계를 했다.
1 + 2
1 + 2 * 3 => 1 + 6 (피연산자 2개를 1개로 업데이트)
1 + 6 / 6 => 1 + 1 (피연산자 2개를 1개로 업데이트)
1 + 1 = => 2 (=가 나오면 바로 계산 결과를 업데이트)
피연산자와 연산자를 하나의 스택에 넣는 방식으로 구현할 계획이다.
Author And Source
이 문제에 관하여(데브코스 W2D1 TIL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@y005/데브코스-W2D1-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)