클래스 자체가 자료형으로 사용가능하기에 래퍼클래스도 자료형으로도 사용 가능하고, 그 안에 메소드도 활용가능
기본 자료형(primitive)
- 자료형 사용 o, 메소드 사용x
참조 자료형(non-primitive, reference type)
(Wrapper Class = 참조형)
-자료형 사용 o, 메소드 사용 o
기본 자료형
Wrapper Class
boolean
Boolean
char
Character
byte
Byte
int
Integer
short
Short
long
Long
float
Float
double
Double
boxing vs unBoxing
기본자료형 vs Wrapper클래스
boxing : 기본자료형 → wrapper클래스로 변환(객체화)
unBoxing : wrapper클래스 → 기본자료형으로 변환
객체에 저장되어 있는 데이터를 기본형 데이터로 꺼내는 작업
Wrapper클래스가 박스
안에 메소드,필드 등 담아두기에 박스
반대로 박스(객체)에 저장되어 있는 데이터를 기본형 데이터로 꺼내는 작업이 언박싱
// boxing
int num1 = 10;
Integer integer1 = new Integer(**num1**); // num1 자체를 래퍼클래스로 전환 -> boxing
// unBoxing
int num2 = integer1.**intValue();** // num2 : 래퍼클래스를 기본자료형 int로 변환 -> unBoxing
// boxing
int i = 10;
Integer iValue1 = new Integer(i);
Integer iValue2 = new Integer(123);
double d = 1.123;
Double dValue1 = new Double(d);
Double dValue2 = new Double(5.323);
// unBoxing
Integer iValue = new Integer(4578);
int i = iValue.intValue();
Double dValue = new Double(44.241);
double d = dValue.doubleValue();
autoBoxing, autoUnBoxing
JDK1.5버젼부터 지원
자동으로 박싱,언박싱
기본 타입과 Wrapper클래스 타입 간의 변환이 자동으로 이루어진다
(바로 대입적용이 가능케됨)
// 자동박싱,언박싱. 바로 대입적용이 가능케됨
Integer integer2 = num1; // autoBoxing
int num3 = integer2; // autoUnBoxing
int i = 10;
Integer iValue = i; // 바로 대입 가능
Double dValue = new Double(3.14);
double d = dValue; // 바로 대입 가능
1)String을 기본 자료형으로 바꾸기
parsing(파싱)
기본자료형에서 래퍼클래스로 변환하기 위해 많이 사용하는게 파싱(parsing)
parsing : 문자열을 기본 자료형으로 변환하는 것
변환가능한 같은 형태이여야한다
ex) 숫자면 숫자끼리. 문자열 "1"을 int 1로 변환 가능
int i = Integer.parseInt("10");
double d = Double.parseDouble("홍길동");
// 에러메시지 : java.lang.NumberFormatException: For input string: "홍길동"
// 파싱할 자료형의 형태를 지니지 않아서 나는 에러
short s = Short.parseShort("10 "); // 잦은 실수 요인 : 공백 조심
float f = Float.parseFloat(" 10");
boolean b = Boolean.parseBoolean("true");
byte by = Byte.parseByte("10");
Long l = Long.parseLong("10");
// 캐릭터 래퍼클래스에는 파싱기능 존재x -> chatAt()로 대체
byte b = Byte.parseByte("1");
short s = Short.parseShort("2");
int i = Integer.parseInt("3");
long l = Long.parseLong("4");
float f = Float.parseFloat("0.1");
double d = Double.parseDouble("0.2");
boolean bool = Boolean.parseBoolean("true");
char c = "abc".charAt(0);
2)primitive type(기본 자료형)을 String으로 바꾸기
String str1 = i + ""; // 방법1. 가장 쉬운 변환.대중적 사용
String str2 = String.valueOf(s); // 방법2
String str3 = Byte.valueOf(by).toString(); // 방법3
String b = Byte.valueOf((byte)1).toString();
String s = Short.valueOf((short)2).toString();
String i = Integer.valueOf(3).toString();
String l = Long.valueOf(4L).toString();
String f = Float.valueOf(0.1f).toString();
String d = Double.valueOf(0.2).toString();
String bool = Boolean.valueOf(true).toString();
String ch = Character.valueOf('a').toString();
미완성 메소드라 오버라이딩 해야되는데 private이면 오버라이딩 자체가 불가능하기에 논리가 안맞음
*추상 클래스의 상수는 static 선언이 필요
▶ 인터페이스(Interface)
상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체
메소드 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것
상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야 함
공통적 규약을 만들기 위해 쓰이며, abstract보다 더 강력한 규약을 만들기 위해 사용함
abstract < Interface
*왜 그렇게 말할까?
추상 메소드만 작성할 수 있음
사용법
[접근제한자] interface 인터페이스명 { }
이 안에는 상수형 필드와 추상 메소드만 들어갈 수 있다
상수형 필드 : [public static final]
추상 메소드 : [public abstract]
[접근제한자] interface 인터페이스명 {
// 상수도 멤버로 포함할 수 있음
public static final 자료형 변수명 = 초기값; // 추상 메소드만 선언 가능
[public abstract] 반환자료형 메소드명([자료형 매개변수]); // public abstract가 생략되기 때문에
// 오버라이딩 시 반드시 public 표기해야 함
}
인터페이스 앞 수식어들을 생략할 수 있는 이유
어차피 들어갈 수 있는 수식어들이 한정되어 있고
없으면 어차피 인터페이스 자체가 존재 불가능이기 때문
특징
1)모든 인터페이스의 메소드는
상수형 필드와 추상메소드만 들어갈 수 있기 때문에 묵시적으로public static final, public abstract
// 기존
Animal a = new Animal(); // o
Dog d = new Dog(); // o
Snake s = new Snake() ; // o
// 다형성
Animal a1 = new Dog(); // o
Animal a2 = new Snake(); // o 이를 업캐스팅(Upcasting)이라고 함
상속을 전제로,
부모 타입으로 만들어진 자식 객체를 부모 클래스 타입으로 다룰 수 있는(담을 수 있는) 기능
자식을 부모에게 담는 것
자식 객체를 부모타입에 담는 것을 다형성
Class의 형변환 (Upcasting, Downcasting)
형변환은 클래스 사이에서 일어나는데 자바의 상속 관계에 있는 부모와 자식 클래스 간에는 서로 형변환이 가능
1)upcasting
upcasting은 서브타입의 인스턴스를 수퍼타입의 변수로 접근하는 것을 말합니다.
즉, 자식 클래스가 부모 클래스 타입으로 캐스팅 되는것을 뜻합니다.
이때 서브 타입에서는 수퍼타입에 선언된 필드 혹은 메서드만 접근 가능합니다.
2) down casting
downcasting은 서브타입 인스턴스를 참조하는 수퍼타입 변수를 재참조하는 것을 말합니다.
즉, 부모 클래스가 자식클래스 타입으로 캐스팅되는 것을 뜻합니다.
이때 강제형변환이 일어나며, 다운캐스팅한 타입에서 선언된 모든 필드와 메서드에 접근이 가능합니다.