[6/2 TIL] JAVA(개발환경, 타입, Constant Pool, Object, .gitignore)

yumyeonghan·2023년 6월 7일
0
post-thumbnail

🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃

JAVA 개발환경

그림 출처 바로가기

JDK

  • JRE를 포함하며 자바 프로그램을 개발, 컴파일, 디버그 및 실행하는 데 필요한 도구를 제공합니다.
  • Compiler(javac)를 포함합니다.
    • 자바 소스 코드를 컴파일하여 실행 가능한 바이트코드로 변환합니다.
  • Debugger(jdb)를 포함합니다.
    • 프로그램의 실행 중에 문제를 진단하고 수정할 수 있습니다.

JRE

  • 자바 응용 프로그램을 실행할 때 필요한 자바 가상 머신(JVM), 자바 클래스 라이브러리, 실행 환경 설정 등을 포함합니다.
  • JVM을 통해 바이트코드를 해석하고 실행하며, 메모리 관리, 스레드 관리, 예외 처리를 합니다.
  • 자바 프로그램에서 사용할 수 있는 표준 클래스 라이브러리를 제공합니다.
  • 자바 프로그램을 실행하기 위해 필요한 JVM 동작 방식, 메모리 할당, 클래스 경로 등을 관리합니다.

JVM

  • 자바 바이트코드를 해석하고 실행되며, 운영 체제에 독립적입니다.
    • 자바 프로그램을 한 번 작성하면 어떤 운영 체제에서든 실행할 수 있습니다.
  • 가비지 컬렉션을 통해 자동적으로 메모리를 관리합니다.
    • 명시적으로 메모리를 할당하거나 해제할 필요가 없습니다.
  • 클래스 파일을 동적으로 로딩하여 실행합니다.
    • 자바의 리플렉션(reflection) 기능을 지원하며, 프로그램 실행 중에 클래스를 동적으로 로드하고 사용할 수 있습니다.
  • 멀티스레드 환경에서의 실행을 지원합니다.


그림 출처 바로가기

타입

  • Java는 8가지 기본형 타입과 나머지 참조형 타입으로 나뉩니다.
    • 기본형(primitive type): boolean, char, byte, int, short, long, float, double
    • 참조형(reference type): 8가지 기본형을 제외하고 배열(array)을 포함한 모든 타입

Call BY Value

public void changeValue(int value) {
    value = 10;
}

int number = 5;
changeValue(number);
System.out.println(number); // 출력 결과: 5
  • 메서드에 매개변수로 전달되는 값(기본형)을 복사하여 전달하는 방식입니다.
  • 복사된 값을 사용하기 때문에 메서드 내에서 매개변수의 값을 변경하더라도 호출한 쪽의 변수 값은 변하지 않습니다.

Call By Reference

public void changeValue(int[] array) {
    array[0] = 10;
}

int[] numbers = {5, 6, 7};
changeValue(numbers);
System.out.println(numbers[0]); // 출력 결과: 10
  • 메서드에 매개변수로 전달되는 변수의 주소(참조형)를 전달하는 방식입니다.
  • 전달된 주소를 사용하기 때문에 메서드 내에서 매개변수의 값이 변경되면 호출한 곳의 변수도 함께 변경됩니다.

Constant Pool

  • 자바 클래스 파일 내에 있는 문자열 리터럴과 다양한 상수들을 관리하는 영역입니다.
  • 중복된 상수를 제거합니다.
    • 같은 문자열 리터럴을 여러 곳에서 사용시, 하나의 문자열 상수만 유지하고 참조를 공유합니다.

String

String str1 = "Hello";
String str2 = "Hello";
  • 위 코드에서 "Hello"는 문자열 리터럴로 Constant Pool에 저장됩니다.
  • 변수 str1과 str2는 2개의 String 객체를 참조하고 있지만, 실제로 Constant Pool에서 동일한 상수를 참조합니다.
  • Constant Pool에서 중복을 제거하고 참조를 공유해서 메모리를 절약합니다.
  • str1 == str2가 true가 됩니다.

String str3 = new String("Hello");
String str4 = new String("Hello");
  • new 키워드로 문자열을 생성한 경우 Constant Pool에 같은 값이 있더라도 새로운 객체를 생성하게 됩니다.
  • str1 == str2가 false가 됩니다.

String 타입 문제

  • String 타입은 불변성(immutable)을 가지고 있습니다.
  • 한번 생성된 String 객체는 변경할 수 없으며, 문자열 연산(+=)이 발생할 때마다 새로운 String 객체가 생성됩니다.
  • 반복문을 사용해서 += 을 할 경우 매번 새로운 String 객체를 생성하므로 메모리 사용과 성능에 부담을 줍니다.
  • 따라서 이때는 가변성(mutable)을 가진 StringBuffer나 StringBuilder을 사용하는것이 좋습니다.

StringBuffer, StringBuilder

  • StringBuffer
    • 동기화된 메소드로 구성되어 여러 스레드가 동시에 접근하여 문자열을 변경할 수 있습니다.
  • StringBuilder
    • 비동기 메소드로 구성되어 단일 스레드 환경에서 StringBuffer보다 성능상 이점을 가집니다.

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
  1. append() 메소드를 사용해서 내부 버퍼에 문자열을 추가하거나 변경합니다.
  2. toString, 또는 객체를 사용할 때 Constant Pool에 객체를 생성합니다.

StringBuffer, StringBuilder를 사용하면 String과 달리 Constant Pool에 문자열이 변경될 때마다 새롭게 객체가 생성되지 않고, 실제 사용할 객체만 생성되기 때문에 성능을 향상시킵니다.

Object

  • 모든 객체의 최상위 객체입니다.
  • 모든 객체에는 Object의 메소드(toString, equals, hashCode)를 호출할 수 있습니다.

toString()

  • 객체 출력시 자동으로 toString() 메소드를 호출합니다.
  • 기본으로 객체의 클래스 이름 + @ + 해시 코드를 포함한 문자열을 반환합니다.
  • 하위 클래스에서 가독성 있게 재정의해서 사용합니다.

equals()

  • 객체의 동일성이 아닌 동등성을 비교하는데 사용됩니다.
  • 하지만 equals 메소드는 기본적으로 동일성의 기능을 하기 때문에 오버라이딩이 필요합니다.
    • 동일성(==): 두 객체가 동일한지 참조(주소) 비교
    • 동등성(equals): 내부 상태나 속성 비교

public class Person {
    private String name;
    private int age;

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        Person other = (Person) obj;
        return age == other.age && Objects.equals(name, other.name);
    }
}
  • equals()를 재정의해서 객체의 내부 상태나 필드(name, age)를 비교합니다.

hashCode()

  • 객체의 해시 코드를 반환하는데 사용됩니다.
  • 해시 코드는 객체를 식별하는 정수값으로, 해시맵에서 객체를 저장하고 검색하는데 사용됩니다.

public class Person {
    private String name;
    private int age;

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
  • hashCode()를 재정의해서 name과 age 필드를 기반으로 객체의 해시 코드를 생성합니다.

equals(), hashCode()

  • equals()와 hashCode() 메소드는 함께 사용되어야 합니다.
  • 객체를 저장할 때 해시 코드 기반으로 저장하고, 객체를 검색할 때 동등한 해시 코드를 가진 객체들 중에서 equals() 메소드로 추가적인 비교를 합니다.
  • 따라서 equals()와 hashCode() 메소드는 객체의 동등성 판단과 컬렉션에서의 정상적인 동작을 보장하기 위해 함께 구현되어야 합니다.

.gitignore

  • 깃에 올라가지 않아야 할 파일들을 관리할 수 있습니다.
    • 빌드결과, 바이너리, 제너레이트 가능한 파일, 로컬설정, 키/보안관련 파일들
    • ex) .class, .jar, build/
    • 이곳을 활용할 수 있습니다.
profile
웹 개발에 관심 있습니다.

0개의 댓글