안녕! 당신은 이미 기본 유형에 대해 잘 알고 있으며 관련 작업을 꽤 많이 했습니다. 프로그래밍(특히 Java)에서 프리미티브는 많은 이점이 있습니다. 프리미티브는 메모리를 거의 사용하지 않으며(따라서 프로그램을 더 효율적으로 만듭니다) 명확하게 정의된 값 범위를 가집니다. 그러나 Java를 배우는 동안 우리는 이미 "Java의 모든 것은 객체입니다"라는 진언을 반복했습니다. 그러나 프리미티브는 그 말과 직접적으로 모순됩니다. 그것들은 물건이 아닙니다. 그렇다면 우리의 "모든 것은 객체다" 원칙이 잘못된 것일까요? 사실 그렇지 않습니다. Java에서 모든 기본 유형에는 쌍둥이 형제인 래퍼 클래스가 있습니다.
래퍼 클래스란 무엇입니까?
래퍼는 프리미티브를 내부에 저장하는 특수 클래스입니다. 그러나 클래스이기 때문에 인스턴스를 만들 수 있습니다. 기본 값을 내부에 저장하지만 여전히 실제 객체입니다. 래퍼 클래스 이름은 해당 프리미티브의 이름과 매우 유사합니다(또는 정확히 동일합니다). 그래서 그들은 기억하기 쉽습니다.
기본 데이터 유형에 대한 래퍼 클래스 |
기본 데이터 유형 |
래퍼 클래스 |
정수 |
정수 |
짧은 |
짧은 |
긴 |
긴 |
바이트 |
바이트 |
뜨다 |
뜨다 |
더블 |
더블 |
숯 |
성격 |
부울 |
부울 |
래퍼 개체는 다른 개체와 동일한 방식으로 생성됩니다.
public static void main(String[] args) {
Integer i = new Integer(682);
Double d = new Double(2.33);
Boolean b = new Boolean(false);
}
래퍼 클래스를 사용하면 기본 유형의 단점을 완화할 수 있습니다. 가장 분명한 것은 프리미티브에는 메서드가 없다는 것입니다.
예를 들어 toString() 메서드가 없으므로 예를 들어
int를 String 으로 변환할 수 없습니다 . 그러나
Integer 래퍼 클래스를 사용하면 이 작업을 쉽게 수행할 수 있습니다.
public static void main(String[] args) {
Integer i = new Integer(432);
String s = i.toString();
}
그러나 다른 방향으로 변환하는 것은 까다로울 수 있습니다. 숫자가 포함되어 있음을 확실히 알고 있는
String 이 있다고 가정해 보겠습니다 .
그럼에도 불구하고 기본 int를 사용하여 문자열 에서 숫자를 추출 하고 숫자로 변환하는 기본 방법은 없습니다 . 그러나 래퍼 클래스를 사용하면 가능합니다.
public static void main(String[] args) {
String s = "1166628";
Integer i = Integer.parseInt(s);
System.out.println(i);
}
산출:
1166628
String 에서 성공적으로 숫자를 추출하여
Integer 참조 변수
i 에 할당했습니다 . 그건 그렇고, 참조에 관해서. 인자는 값에 의한 프리미티브, 참조에 의한 객체 등 다양한 방식으로 메소드에 전달된다는 것을 이미 알고 있습니다. 자신의 메서드를 만들 때 이 지식을 사용할 수 있습니다. 예를 들어 메서드에서 분수를 사용하지만 참조로 전달하는 논리가 필요한 경우 메서드에 double / float 대신 Double /
Float 인수
를 전달할 수
있습니다 . 래퍼 클래스의 메서드 외에도 정적 필드도 매우 편리할 수 있습니다. 예를 들어 다음과 같은 작업이 있다고 가정합니다. 가능한 최대 표시
int 값 다음에 가능한 최소값. 이 문제는 다소 기본적인 것 같습니다. 그러나 Google 없이는 할 수 없을 것입니다. 그러나 래퍼를 사용하면 이러한 "일상적인 작업"을 쉽게 처리할 수 있습니다.
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
이러한 필드는 더 심각한 작업을 수행하는 데 방해가 되는 것을 방지합니다.
2147483647 (MAX_VALUE의 값이 됨)을 입력하는 것이 사소한 일이 아니라는 사실은 말할 것도 없습니다 ! :) 게다가, 이전 수업에서 우리는 래퍼 객체가 불변이라고 지적했습니다.
public static void main(String[] args) {
Integer a = new Integer(0);
Integer b = new Integer(0);
b = a;
a = 1;
System.out.println(b);
}
산출:
0
원래 a 가 가리키는 객체의 상태는 변경되지 않았습니다(
b 의 값 도 변경되었을 것이기 때문).
String 과 마찬가지로 래퍼 객체의 상태를 변경하는 대신 완전히 새로운 객체가 메모리에 생성됩니다. 그렇다면 Java 제작자가 궁극적으로 기본 유형을 언어에 남겨두기로 결정한 이유는 무엇입니까? 모든 것이 객체여야 하고 프리미티브가 표현하는 모든 것을 표현할 수 있는 래퍼 클래스가 있으므로 래퍼를 언어에 유지하고 프리미티브를 제거하면 안 되는 이유는 무엇입니까? 답은 간단합니다. 바로 성능입니다. 기본 유형은 개체의 "무거운" 기능이 부족하기 때문에 기본 유형이라고 합니다. 예, 개체에는 편리한 메서드가 많이 있지만 항상 필요한 것은 아닙니다. 때로는 숫자 33 또는 2.62 또는
true /
false 만 있으면 됩니다 . 객체의 이점이 중요하지 않고 프로그램이 작동하는 데 필요하지 않은 상황에서는 프리미티브가 작업에 훨씬 더 적합합니다.
GO TO FULL VERSION