서론
오늘은 자바의 기본적인 내용인 변수와 기본 타입, 참조 타입에 대해서 공부를 하였고. 이미 알고 있는 개념이라고 생각하였지만 막상 이 내용을 다른 사람에게 설명하려고 하니 내가 예상보다 더 이해하지 못함을 깨달았다. 그래서 다시 한번 나만의 언어로 정리하여 개념을 명확하게 이해하려고 노력하였다.
본론
기본타입(Primitive)
기본 타입 변수는 자바에서 기본적인 데이터 타입을 저장하는 변수이다. 기본 타입 변수는 모두 8개가 존재하며 기본 타입은 값을 직접적으로 접근하기 떄문에 연산속도가 빠르다는 장점이 존재하지만 추가적인 기능 (메서드)를 지원하지 않는다.
기본타입의 종류
크기 | 정수형 | 실수형 | 문자 | 불리언 |
1byte | byte | - | - | boolean |
2byte | short | - | char | |
4byte | int | float | - | |
8bte | long | double |
참조 타입(Reference)
참조 타입은 기본 타입을 제외한 모든 데이터 타입을 의미한다. 문자열을 표현하는 String 타입도 참조 타입에 포함된다. 참조 타입의 변수는 기본 타입과 달리 값을 직접 저장하지 않고, 값이 저장된 메모리의 주소를 저장한다. 기본 타입과 달리 직접적인 값 접근이 없기 때문에 상대적으로 느리지만, 객체이므로 다양한 속성과 메서드를 지원한다.
오토박싱 (Auto-boxing)
자바에서는 기본 타입과 참조 타입간의 타입 변화를 위해 오토박싱과 언박싱이 존재한다. 먼저 오토박싱은 기본 타입의 값을 자동으로 참조 타입의 값으로 변환하는 과정을 말한다. 자바는 기본 타입을 참조 타입으로 변환하는 과정을 자동으로 변환 해주기 때문에 사용자가 직접적으로 변환을 수행할 필요가 없다.
int num = 10; // 기본 타입 int
Integer obj = num; // 오토박싱: int -> Integer
위 예제에서 int 타입의 변수 num은 자동으로 Integer 객체로 변환된다.
언박싱 (Unboxing)
그렇다면 반대로 언박싱은 참조 타입에서 기본 타입으로 변환하는 과정을 말한다. 오토박싱과 마찬가지로 참조 타입 객체에서 기본 타입으로 자동으로 변환 해준다.
Integer obj = 10; // 참조 타입 Integer
int num = obj; // 언박싱: Integer -> int
위 예제에서 Integer 객체 obj는 자동으로 int 타입의 변수 num으로 변환된다.
래퍼 클래스 (wrapper Class)
래퍼 클래스는 자바에서 기본 타입을 객체로 변환하기 위해 제공되는 클래스를 말한다. 기본 타입은 객체가 아니기 때문에 추가적인 기능(메서드)과 객체 기반의 기능을 사용할 수 없다. 이러한 문제를 해결하기 위해 래퍼 클래스는 기본 타입의 값을 객체로 감싸서 이러한 기능들을 사용할 수 있도록 도와준다.
기본 타입과 대응하는 래퍼 클래스
- byte: Byte
- short: Short
- int: Integer
- long: Long
- float: Float
- double: Double
- char: Character
- boolean: Boolean
Call by Value
자바에서는 메서드를 호출시 항상 Call by Value 방식을 사용한다. Call by Value란 메서드 호출시 인자 값이 복사되어 메서드의 매개변수로 전달되는것을 이야기한다.
기본 타입의 경우
기본 타입의 경우 메서드 호출시 인자 값이 복사되어 메서드로 전달된다. 따라서 메서드내에 매개변수의 값을 변경하여도 원본 변수에 영향을 미치지 않는다.
public class CallByValueExample {
public static void main(String[] args) {
int num = 10;
modifyValue(num);
System.out.println("After method call: " + num); // 10
}
public static void modifyValue(int value) {
value = 20;
}
}
위 코드에서 num의 값이 modifyValue 메서드에 전달될 때, value 변수는 num의 복사본이므로 value를 변경해도 num의 값에는 영향을 미치지 않는다.
참조 타입의 경우
Call by Value는 인자 값이 복사되어 메서드의 매개변수로 전달된다고 하였다. 그렇다면 참조 타입의 경우는 객체의 주소가 복사되어 매개변수로 전달될 것이다. 따라서 메서드 내에서 객체의 속성을 변경하려고 한다면 원본 객체에도 영향을 미치게 된다. 그러나 메서드 내에서 복사된 주소를 다른 객체의 주소로 바꾸더라도, 원본 객체의 참조는 변경되지 않는다 즉, 참조를 새 객체로 변경해도 원본 객체는 여전히 같은 주소를 참조하고 있어, 원본 객체에 대한 참조는 유지된다.
public class ReferenceExample {
public static void main(String[] args) {
MyObject obj = new MyObject();
obj.value = 10;
modifyObject(obj);
System.out.println("After method call: " + obj.value); // 20
}
public static void modifyObject(MyObject obj) {
obj.value = 20; // 객체의 속성 변경
obj = new MyObject(); // 새로운 객체 생성, 원본 obj에는 영향 없음
obj.value = 30;
}
}
class MyObject {
int value;
}
결론
누군가에게 설명하지 못한다면 이해하지 못한거라고 생각한다.
'TIL' 카테고리의 다른 글
[TIL | 2024-08-27] 추상 클래스, 추상 메서드, 인터페이스 (0) | 2024.08.29 |
---|---|
[TIL | 2024-08-26] 상속, 오버라이딩 (0) | 2024.08.26 |
[TIL | 2024-08-24] 메서드, 프로그램의 기능적 분할, 객체 지향 프로그래밍 (0) | 2024.08.23 |
[TIL | 2024-08-23] 배열, 반복문 (0) | 2024.08.22 |
[TIL | 2024-08-21] Git과 GitHub 기초 (1) | 2024.08.21 |