JavaRush /Java Blog /Random-KO /커피 브레이크 #121. Java의 Classpath란 무엇이며 어떻게 설치하나요? Java의 불변성

커피 브레이크 #121. Java의 Classpath란 무엇이며 어떻게 설치하나요? Java의 불변성

Random-KO 그룹에 게시되었습니다

Java의 Classpath란 무엇이며 어떻게 설치하나요?

출처 : Medium 프로그래밍의 기본과 프로그램 파일의 실행 흐름을 알면 언어를 이해하는 데 도움이 됩니다. Classpath 매개변수를 아는 것은 모든 Java 개발자가 알아야 하는 기본 개념 중 하나입니다. 오늘은 클래스 경로( Classpath )가 무엇인지, 어떻게 설정하는지, JVM이 클래스 파일을 실행하는 데 어떻게 도움이 되는지 논의하겠습니다 .커피 브레이크 #121.  Java의 Classpath란 무엇이며 어떻게 설치하나요?  Java의 불변성 - 1

클래스패스란 무엇입니까?

클래스 경로 는 Java의 기본 매개변수 중 하나이지만 프로그래밍을 처음 접하는 사람들이 종종 오해하는 경우가 있습니다. 단순화하기 위해 클래스 경로는 Java 컴파일러와 JVM이 다른 클래스를 컴파일하거나 실행하는 데 필요한 클래스를 찾아야 하는 경로 집합 입니다 .

Classpath가 JVM의 클래스 파일 실행을 돕는 방법

예부터 시작해 보겠습니다. /Users/vikram/Documents/test-java/src/com/programming/v1/Main.java 폴더 에 Main.java 파일이 있다고 가정해 보겠습니다 .
package com.programming.v1;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello classpath");
    }
}
/Users/vikram/Documents 에 있고 이 클래스를 컴파일한다고 가정해 보겠습니다.
javac test-java/src/com/programming/v1/Main.java
이제 이 클래스 파일을 실행하려면 java 명령 의 classpath 또는 cp 플래그를 사용하여 .class 파일 을 찾을 위치를 Java Virtual Machine에 알려야 합니다 .
vg@lp1 Documents % java -cp "test-java/src" com.programming.v1.Main
Hello classpath
vg@lp1 Documents % java -classpath "test-java/src" com.programming.v1.Main
Hello classpath
첫 번째 매개변수는 패키지가 작성되는 루트 폴더입니다. 두 번째 매개변수는 클래스 이름을 포함한 패키지 이름입니다. Java 명령이 실행되면 Java Virtual Machine은 test-java/src 폴더를 살펴본 다음 이를 실행하기 위해 기본 클래스를 로드합니다.

클래스 경로 변수를 설정하는 방법

Classpath 변수는 Linux 시스템에서 아래와 같이 설정할 수 있습니다.
export CLASSPATH="test-java/src"
Windows 시스템의 클래스 경로는 환경 변수를 사용하여 추가/업데이트할 수 있습니다. 환경 변수가 설정되면 아래와 같이 java 명령을 실행할 수 있습니다.
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
이것이 Classpath 에 대해 알아야 할 전부입니다 . 읽어 주셔서 감사합니다!

Java의 불변성

출처: Java의 중간 변수에는 기본 변수와 참조 변수의 두 가지 유형이 있습니다. Java의 모든 것은 값으로 전달되지만 참조 유형의 경우 전달된 메모리 주소를 사용하여 소스 데이터를 업데이트할 수 있습니다. final커피 브레이크 #121.  Java의 Classpath란 무엇이며 어떻게 설치하나요?  Java의 불변성 - 2 키워드는 변수가 상수로 작동하도록 하는 데, 즉 재할당을 방지하는 데 사용됩니다. 이는 힙 메모리가 없는 기본 요소에 잘 작동하는 반면, 참조 유형의 경우 재할당만 제한되고 내부 상태가 변경될 수 있습니다. 이로 인해 많은 동시성 문제와 경쟁 조건이 발생할 수 있습니다. 따라서 Java의 일반 유형에 불변 특성을 포함하면 많은 이점을 얻을 수 있습니다.

Java 불변성의 이점

1. 스레드 안전성

불변 유형은 객체가 생성된 후에도 일관성을 유지하므로 다중 스레드 환경의 경쟁 조건에 영향을 받지 않습니다. 여러 스레드는 내부 상태를 변경할 수 없으므로 동기화가 필요하지 않습니다.

2. 기본형

Java 표준 라이브러리의 문자열은 기본 클래스의 좋은 예입니다. 이는 그 위에 비즈니스 로직 도메인을 구축하는 데 사용할 수 있는 매우 간단하고 변경할 수 없는 클래스입니다. 마찬가지로 불변 유형은 빌드할 때 훌륭한 기본 유형 역할을 할 수 있습니다.

형질

1. 개인 및 최종 필드

객체의 상태를 포함하는 필드는 privatefinal 입니다 . 비공개 가시성은 필드에 대한 직접 액세스를 방지하는 반면, 최종 가시성은 필드가 한 번만 할당되도록 보장 합니다 .

2. 수정자 메서드 없음

Private 필드는 클래스 외부에서 접근할 수 없습니다. 일반적으로 필드를 읽고 쓸 수 있도록 액세스 메서드(getter)와 수정자 메서드(setter)가 각각 제공됩니다. 일관성을 보장하기 위해 수정자는 허용되지 않습니다.

3. 최종 수업

클래스 상속을 허용하면 불변성이 손상될 수 있습니다. 불변 클래스를 확장하는 서브클래스는 객체의 상태에 영향을 미칠 수 있습니다. 따라서 클래스는 final 입니다 .

4. 방어용 사본

객체 생성 중에 생성자의 인수를 전용 필드에 직접 할당하는 대신 인수의 전체 복사본(또는 불변 복사본)을 생성하면 외부 수정이 제공됩니다. 인수 중 하나가 참조 유형인 경우 호출자 측에서 쉽게 조작할 수 있습니다. 보호 복사본을 만들면 이러한 조작을 피할 수 있습니다. 마찬가지로 접근자(getter)의 경우 내부 필드를 직접 참조하는 대신 해당 필드의 복사본을 자유롭게 공유할 수 있습니다.

구현

직원

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public final class Employee {

    private final long id;
    private final String name;
    private final LocalDate joinDate;
    private final List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public LocalDate getJoinDate() {
        return joinDate;
    }

    public List<String> getAchievements() {
        return achievements;
    }
}
  • 모든 필드에 생성자에 보호 복사본이 있는 것은 아닙니다. 이는 id 가 기본이고 nameJoinDate 필드가 변경할 수 없는 유형이기 때문입니다. 호출자가 변경할 수 없으며 변경되지 않은 상태로 유지되는 반면, 업적 필드에는 List.copyOf 메서드 를 사용하여 만든 인수의 복사본이 필요합니다 . 이는 copyOf가 불변의 List를 반환하기 때문입니다 .

  • 마찬가지로, 접근자 메서드는 모든 필드 유형이 불변이므로( achievements 포함 ) 클래스 외부에서 수정할 수 없기 때문에 방어 복사본이 아닌 필드를 직접 반환합니다 .

개량

자바 16 이전

Employee 구현은 Lombok 과 같은 라이브러리를 사용하여 개선할 수 있습니다 . 이렇게 하면 코드의 장황함이 줄어들어 코드가 더 깔끔하게 보입니다. 라이브러리에는 표준 코드를 단축하기 위한 주석이 함께 제공됩니다. @Value (주석)를 사용하여 모든 인수에 대한 getter 및 생성자를 생성할 수 있습니다. 이는 또한 final 클래스와 privatefinal 필드를 생성합니다 . 참고로 toString , equalshashCode 메소드도 생성합니다 . Employee 구현은 아래와 같이 @Value를 사용하여 다시 작성할 수 있습니다 .
import lombok.Value;

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

@Value
public class Employee {

    long id;
    String name;
    LocalDate joinDate;
    List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

자바 16 이상

Java 16 릴리스에는 새로운 기록 기능이 도입되었습니다 . JEP에서 명시한 대로 이러한 클래스는 불변 데이터의 투명한 전달자 역할을 하며 명목 튜플로 간주될 수 있습니다. Employee 클래스는 아래와 같이 레코드 Employee 로 다시 구현할 수 있습니다 .
import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public record Employee(long id,
                       String name,
                       LocalDate joinDate,
                       List<String> achievements) {

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

결함

불변성의 유일한 문제는 작은 수정에도 필요한 추가 메모리와 처리 능력입니다. 새로운 객체를 생성해야 할 때마다 비용이 많이 들 수 있습니다. 이 단점을 해결하기 위해 결과 캐싱 및 저장과 같은 메커니즘을 구현할 수 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION