1. 기본형과 참조형의 메서드 호출
▶ 자바에서 메서드의 매개변수(파라미터)는 항상 값에 의해 전달된다. 그러나 이 값이 실제 값이냐, 참조값이냐에 따라 동작이 달라진다.
▷ 기본형 : 메서드로 기본형 데이터를 전달하면 해당 값이 복사되어 전달된다. 이 경우 메서드 내부에서 매개변수의 값을 변경해도 호출 자의 변수 값에는 영향이 없다. -> 예를 들어 a의 값을 b에 담아두면 a의 값을 바꾼다고 해서 b가 변하지 않듯
▷ 참조형 : 메서드로 참조형 데이터를 전달하면 참조값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수로 전달된 객체의 멤버 변수를 변경하면 호출자의 객체도 변경된다. -> 주소값을 복사해오는 거라 둘 다 바뀜
▶ 참조형은 메서드를 호출할 때 참조값을 전달한다. 따라서 메서드 내부에서 전달된 참조값을 통해 객체의 값을 변경하거나 값을 읽어 사용할 수 있다. 말은 어렵지만 아래 예시 코드를 보면 금방 이해된다.
static void initStudent(Student student, String name, int age, int grade) {//메서드
student.name = name; //인스턴스에 넘겨온 매개변수의 값을 대입해준다
student.age = age;
student.grade - grade;
}
Student student1 = new Student(); //위에 만들어진 메서드를 호출
initStudent(student1, "학생1", 15, 90); //전달한 학생 객체의 필드에 값을 설정하는 것
▶ 즉, 메서드로 데이터를 전달하면 기본형은 기본형 데이터의 실제 해당하는 '값'을 복사해 전달, 참조형은 참조형 데이터의 '참조값'이 복사되어 전달된다.
2. static 영역에서의 final
▶ 값이 들어가면 끝. 더이상 변경 불가
▶ 생성자를 사용해 final 필드를 초기화하면 인스턴스마다 값이 다르지만 필드를 필드에서 초기화 하는 경우 모든 인스턴스가 같은 값을 가진다. 생성자 초기화와 다르게 필드 초기화는 필드의 코드에 해당 값이 미리 정해져있기 때문이다.
▶ 모든 인스턴스가 같은 값을 사용하게 되면 결과적으로 메모리를 낭비하게 되고 불필요한 중복이 늘어난다.
▷ 이럴 때 static 영역에서의 final을 쓴다. 공용 변수인데 값이 항상 같은 공용변수이다.
▷ 이러한 이유로 필드에 final + 필드 초기화를 사용하는 경우 static 영역을 활용하는 것이 효과적이다.
package final1;
public class FinalFieldMain {
public static void main(String[] args) {
//final 필드 - 생성자 초기화
System.out.println("생성자 초기화");
ConstructInit constructInit1 = new ConstructInit(10); //인스턴스마다 값 달라
ConstructInit constructInit2 = new ConstructInit(20);
System.out.println(constructInit1.value);
System.out.println(constructInit2.value);
//final 필드 - 필드 초기화
System.out.println("필드 초기화");
FieldInit fieldInit1 = new FieldInit();
FieldInit fieldInit2 = new FieldInit();
FieldInit fieldInit3 = new FieldInit();
System.out.println(fieldInit1.value); //10
System.out.println(fieldInit2.value); //10
System.out.println(fieldInit3.value); //10
//상수
System.out.println("상수");
System.out.println(FieldInit.CONST_VALUE); //static 영역
}
}
package final1;
public class ConstructInit {
final int value;
public ConstructInit(int value) {
this.value = value;
}
}
-> 이와 같이 생성자를 사용해서 final 필드를 초기화 하는 경우 각 인스턴스마다 final 필드에 다른 값을 할당할 수도 있다. 물론 final을 사용했기 때문에 생성 이후 이 값을 변경하는 것은 불가능하다.
3. 상수 Constant
▶ 상수는 변하지 않고, 항상 일정한 값을 갖는 수를 말한다.
▶자바에서는 보통 단 하나만 존재하는 변하지 않는 고정값을 상수라고 한다.
▶ 이런 이류로 상수는 static final 키워드를 사용한다.
▶ 상수를 표기할 때
▷ THE_CONSTANT (예시) : 대문자를 사용하고 구분은 _ 로 한다.
▷일반적인 변수와 상수를 구분하기 위해 관례적으로 이렇게 쓴다. (낙타표기법이 안되기 때문에)
▶ 필드를 직접 접근해서 사용한다.
▷ 상수는 기능이 아니라 고정된 값 자체를 사용하는 것이 목적이다.
▷ 상수는 값을 변경할 수 없다. 따라서 필드에 직접 접근해도 데이터가 변하는 문제가 발생하지 않는다.
Opnion
키오스크 과제를 다시 진행하기에 앞서서, 느슨한 지식을 단단하게 만드려고 자바 강의를 처음부터 다시 듣는 중인데, 아무리 봐도
final과 상수가 명확하게 잡히지가 않는다. 대략적으로는 알겠는데 확 이해되는 한 방이 없는 느낌.. 너무 답답하다.
하지만 10000번을 읽고 쓰다보면 이해하기 싫어도 이해가 된다. 매일매일 반복하다보면 이해가 되겠지 하며 복습만이 살 길이다!!
'내일배움캠프 > TIL' 카테고리의 다른 글
[Spring_4기 본캠프] 자바 메모리 구조와 static | Day 28 (0) | 2024.11.26 |
---|---|
[Spring_4기 본캠프] 키오스크 과제&트러블 슈팅 | Day 27 (0) | 2024.11.25 |
[Spring_4기 본캠프] 3주차 - 새로운 과제 키오스크 | Day 25 (2) | 2024.11.21 |
[Spring_4기 본캠프] 3주차 - 계산기 lv2와 트러블 슈팅 | Day 24 (1) | 2024.11.19 |
[Spring_4기 본캠프] 3주차 - 계산기 lv2 | Day 23 (0) | 2024.11.19 |