프로그래밍/Java

Java의 기본 - 5

Cian 2024. 5. 25. 19:20

▶ 쇼트 서킷(short-circuit)
 -불리언 논리 연산자(&&, || 등)에서 발생할 수 있는 특별한 동작을 가리킨다. 쇼트 서킷 평가는 논리 연산자가 피연산자르르 왼쪽에서 오른쪽으로 평가하는 도중에 이미 전체 결과가 확정된 경우, 뒤이어 있는 피연산자들으르 평가하지 않고 중단하는 동작이다.
예를 들어, A && B의 경우, A가 거짓(false)이라면 B를 평가하지 않고 전체 결과를 거짓으로 반환한다. 이는 논리 연산에서 효율적인 평가를 가능하게 한다.
반면에 A || B의 경우, A가 참(true)이라면 B를 평가하지 않고 전체 결과를 참으로 반환한다.
이와 같이 쇼트 서킷 평가는 조건문이나 논리 연산에서 프로그램의 실행 속도를 향상시킬 수 있다. 그러나 이를 잘못 사용할 경우 여러 문제가 발생할 수 있기 때문에(부수 효과, 의도치 않은 로직 실행..) 주의해서 사용해야 한다.


▶ 함수 호출과 참조형 인자
-참조형을 인자로 넘길 때는 조심해야 한다.
-C에서 포인터를 넘기는 것과 마찬가지
-메서드 안에서 참조형 인자의 값을 바꾸면 원본이 바뀐다.
-매개변수로 받은 어떤 인자에 점(.)을 찍고 무언가를 바꾼다면, 그 순간에 원본이 바뀐다고 생각해도 좋다. 값형에는 점(.)을 찍지 못하기 때문 ex) arg.(무언가)


▶ final 참조형 매개변수

public static Vector add(final Vector v1, final Vector v2) {
	Vector sum = new Vcetor();
    
    v1.x += 6547.0f;
    sum.x = v1.x + v2.x;
    sum.y = v1.y + v2.y;
    
    return sum;
}

-위 코드에서 볼 수 있듯이 매개변수에 final을 붙여줬는데 실행과 컴파일에 문제가 없고 결과가 다 바뀌게 된다. final을 앞에 붙였음에도 잘 실행되는 이유는 다음과 같다.

-final은 참조하는 대상, 즉 주소를 저장하고 있다. 그래서 주소 변경이 안 될 뿐이지 그 주소 안에 가서 그 속에 있는 내용을 바꾸는 건 허용한다.

 

public static Vector add(final Vector v1, final Vector v2) {
	...
    v1.x += 6547.0f;          // OK. 주소가 가리키는 값은 변경 가능
    v1 = new Vector(20, 30);  // 컴파일 오류. 주소 변경은 변경 불가능
    ...
}

 

 

▶ Java의 열거형

// 독자적으로 선언
public enum Subject {
	KOREAN,
    ENGLISH,
    MATH
}
// 클래스 내부에 선언
public class SchoolManager {
	public enum Subject {
    	KOREAN,
        ENGLISH,
        MATH
    }
    ...
}

-열거형은 독자적 또는 클래스 내부에 선언할 수 있다.

 

 

▶ 열거형과 배열의 차이

 

-구조적 차이
배열은 동일한 데이터 유형의 값들을 순서대로 저장하는 구조이다. 각 요소는 인덱스를 사용하여 접근할 수 있다.
열거형은 특정한 유형의 상수들의 집합을 정의하는 데 사용된다. 이러한 상수들은 열거형 유형의 인스턴스로 사용되며, 서로 다른 상수 간에 비교할 수 있다.

-데이터 유형
배열은 원하는 데이터 유형을 포함할 수 있다. 예를 들어, int[] 배열은 정수형 데이터를 저장한다.
열거형은 하나의 열거형 상수만 가질 수 있으며, 이는 열거형 유형의 인스턴스이다.

-의미론적 차이
배열은 여러 데이터 값을 순서대로 저장하기 위한 일반적인 구조로 사용된다.
열거형은 서로 연관된 상수들의 그룹을 정의하고 사용하여 코드의 가독성과 안정성을 높이는 데 사용된다.

// 배열을 사용한 요일 표현
String[] daysArray = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

// 열거형을 사용한 요일 표현
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

- 배열은 각 요일을 문자열로 저장하고, 인덱스를 사용하여 요일에 접근한다. 반면에 열거형은 각 요일을 열거형 상수로 정의하고, 열거형 변수를 사용하여 요일을 나타낸다. 열거형을 사용하면 코드의 가독성이 높아지고 오류가 줄어들 수 있다.

 

 

▶ 생성자가 있는 열거형 Subject 예

enum Subject {
	KOREAN(2),
    ENGLISH(3),
    MATH(6);
    
    private int hours;
    
    public int getHours() {
    	return hours;
    }
    
    Subject(int h) { // 언제나 private
    	hours = h;
    }
}