home > bootcamp > lg-eureka > [lg-eureka] 부트 캠프 3일차

[lg-eureka] 부트 캠프 3일차
bootcamp lg-eureka 3일차

intro : 부트캠프 3일차 내용 정리 및 기록.

수업 내용 기록

데이터 타입 [기본 타입]

기본형 타입인 byte, short, int, long, float, double, char, boolean 등의 데이터 타입을 말한다. 기본 타입으로 선언된 변수는 값 자체를 저장하고 있지만, 참조 타입으로 선언된 변수는 객체가 생성된 번지 즉 주소값을 보유하고 있다.

데이터 타입 [참조 타입]

객체의 번지를 참조하는 타입, 배열, 열거, 클래스, 인터페이스 같은 것들을 말한다. 기본 타입으로 선언된 변수는 값 자체를 저장하지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다.

JVM의 힙, 스택, 메소드 영역

JVM은 운영체제에서 할당받은 메모리 영역을 힙 영역, 스택 영역, 메소드 영역으로 구분해서 사용, 벤더사마다 JVM 구조는 디테일 하게는 다르지만 큰 관점에서 공통된 부분은 존재함.

image1

(JVM 예시 이미지)

힙 영역

객체가 생성되는 영역, 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조, 결론적으로 객체와 배열을 저장하는 공간.

스택 영역

메소드를 호출할때마다 생성되는 프레임이 저장되는 영역, 메서드 호출과 관련된 로컬 변수 및 참조 변수를 저장.

메소드 영역

클래스 영역이라고도 부르기도한다, 클래스의 메타데이터, 정적 변수(static 변수), 상수(Constant Pool), 그리고 메서드 코드(바이트코드)가 저장됨.

String 타입

String Constant Pool: 리터럴 문자열(“example”)은 JVM의 String Constant Pool에 저장되어 메모리를 절약. 동일한 리터럴이 있을 경우 Pool의 객체를 재사용.

String s1 = "Hello";
String s2 = "Hello"; // s1과 s2는 같은 객체를 참조 

new String()을 사용하면 새로운 String 객체가 Heap에 생성된다.

String s1 = new String("Hello"); // Heap에 새 객체 생성

값 목록으로 배열 생성

다음과 같이 값 목록으로 배열을 생성할 수 있다.

int[] arr = {1, 2, 3, 4, 5};
int[] arr = new int[] {1, 2, 3, 4, 5};

다만 다음과 같은 방법으로 배열을 생성하는게 일반적이다.

int [] arr = new int[4];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;

객체의 개념과 관계

객체란 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것, 객체는 속성과 동작으로 구성. 자바는 이러한 속성과 동작을 각각 필드메소드라고도 말함.

집합관계 : 완성품과 부품의 관계
사용관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계
상속관계 : 부모와 자식 관계, 필드 메소드를 물려받음

객체지향 프로그래밍의 특징

[캡슐화]

객체의 데이터(필드)행동(메서드)를 하나로 묶고, 외부에서 객체의 내부 구현 세부사항에 접근하지 못하도록 하는 것.

[상속]

부모 클래스(슈퍼 클래스)의 필드와 메서드를 자식 클래스(서브 클래스)가 물려받아 사용하는 것.

[다형성]

같은 형태의 코드(메서드 호출)가 다양한 실행 결과를 만들어내는 것.

[추상화]

복잡한 현실 세계의 개념을 필요한 속성과 행동만 포함하여 프로그래밍적으로 표현하는 것.

클래스와 인스턴스

객체 지향 프로그래밍에서도 객체를 생성하려면 설계도에 해당하는 클래스가 필요함. 클래스로부터 생성된 객체를 해당 클래스의 인스턴스라고 부르며, 클래스로부터 객체를 만드는 과정을 인스턴스화 라고 함, 또한 동일한 클래스로부터 여러개의 인스턴스를 만들 수 있음

this() this의 차이

this()는 생성자에서 다른 생성자를 호출할 때 사용. 동일한 클래스 내에 있는 다른 생성자를 호출하여 코드 중복을 줄이고 객체 초기화를 간결하게 만든다. 주의할 점으로 생성자의 첫 번째 줄에서만 호출할 수 있고, 생성자 체이닝에서 최종적으로는 자기 자신의 초기화가 이루어져야 한다.

this는 현재 객체 자신을 참조하는 키워드. 같은 클래스 내부에서 필드 메서드 생성자 등을 명시적으로 호출하거나 외부에서 전달된 변수와 구분 할때 사용한다.

4조 workshop 토의 내용 기록

메서드 시그니처

메서드 시그니처란 메서드를 고유하게 식별하는 요소를 말한다. 주로 메서드 이름과 매개변수 리스트로 구성되며, 컴파일러가 오버로딩과 오버라이딩을 구분할때 사용한다. 메서드 시그니처의 구성 요소로는 메서드 이름과, 매개변수 리스트(매개변수의 타입, 순서, 개수)를 포함한다. 주의할 점으로 반환타입은 메서드 시그니처에 포함되지 않는다.

객체지향과 절차지향의 차이

[OOP]

현실세계의 객체를 모델링하여 데이터를 객체로 묶어 처리한다. 코드 재사용성이 높고 유지보수성 및 확장성에 장점이 있다.

[POP]

작업을 순차적으로 처리하며 함수 중심으로 설계한다. 특징으로는 데이터와 함수를 분리하는데 단순하여 빠르게 구현 가능함에 장점이 있다.

중요한 둘의 차이점으로는 객체지향은 객체 중심, 절차 지향은 함수 중심에 있다.

String은 언제 heap과 String Constant Pool에 저장될까?

기본적으로 리터럴을 사용한 문자열 String은 String Constant Pool에 저장된다. 만약 new 연산자를 통해 String 객체를 생성하는 경우는 heap 영역에 생성되게 된다. 위 개념은 아래 코드에서 비교연산자 == 를 통해 주소값을 비교할때 true false 값의 결과가 달라진다.

public class Main {
    public static void main(String[] args) {
        String str = "hello"; // String constant pool에 저장
        String str2 = "hello"; // String constant pool에서 재사용
        String str3 = new String("hello"); // 별도의 Heap 메모리에 저장

        System.out.println(str == str2); // true (같은 객체를 재사용하기 때문에)
        System.out.println(str == str3); // false
        System.out.println(str.equals(str3)); // true
    }
}

위 과정에서 str과 str2는 리터럴값이 같은 문자열이기에 내부적으로 같은 주소값(String Constant Pool)을 할당하게 된다. 그렇기에 str과 str2은 true 값을 반환하며, new 연산자로 생성한 str3는 heap 영역에 할당되게 되어, 새로운 주소값이 할당된 값을 보유하고 있기에 str과 str3은 false 값을 반환하게 된다.

image2

(Heap과 String Constant Pool 영역)