java day8
래퍼 클래스(Wrapper class) | 추상클래스(abstract) | 인터페이스(interface) |
래퍼 클래스(Wrapper class)
- 기본타입의 데이터를 객체로 취급해야할 경우 객체로 포장해주는 클래스
데이터 타입
byte -> Byte
short -> short
int -> Integer
long -> Long
float -> Float
double -> Double
char -> Character
boolean -> Boolean
String num = "10";
int i = Integer.parseInt(num);
박싱
기본 타입을 래퍼클래스로 변환
int num = 10;
Integer i = new Integer(num); // 기본 타입 -> 래퍼클래스
언박싱
래퍼 클래스를 기본 타입으로 변환
int num = i.intvalue(); // 래퍼클래스 -> 기본 타입
제네릭(Generic)
- 클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시에 미리 지정하는 방법
Object 클래스
- 자바의 모든 클래스의 최상위 조상 클래스
- 모든 타입은 Object 클래스 객체화를 시킬 수 있음
- 기본 데이터 타입을 객체화 시킨 래퍼 타입으로 대입을 받을 수 있음
public class Box {
private Object obj; // String, int, Integer Apple
public Object getObj() {
return obj;
}
public void setObj(Object obj) { // String, int, Integer Apple
this.obj = obj;
}
}
// -------------------------------------------------------------
public class Fruit {
private String name;
private int price;
private String color;
private String from;
Fruit(){
}
public Fruit(String name, int price, String color, String from) {
this.name = name;
this.price = price;
this.color = color;
this.from = from;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
@Override
public String toString() {
return "Fruit{" +
"과일명='" + name + '\'' +
", 가격=" + price +
", 색상='" + color + '\'' +
", 원산지지='" + from + '\'' +
'}';
}
}
// -------------------------------------------------------------
public class Apple extends Fruit {
private int dangdo;
public Apple(String name, int price, String color, String from, int dangdo) {
super(name, price, color, from);
this.dangdo = dangdo;
}
public int getDangdo() {
return dangdo;
}
public void setDangdo(int dangdo) {
this.dangdo = dangdo;
}
@Override
public String toString() {
return "Fruit{" +
"과일명='" + name + '\'' +
", 가격=" + price +
", 색상='" + color + '\'' +
", 원산지지='" + from + '\'' +
'}' + "{" + "당도=" + dangdo + '}';
}
}
// ------------------------------------------------------------------
public class Object1 {
public static void main(String[] args) {
Box box = new Box();
box.setObj("안녕하세요"); // String
System.out.println(box.getObj()); // 안녕하세요
box.setObj(10);
System.out.println(box.getObj()); // 10
Apple apple = new Apple("사과", 1000, "빨강", "청송", 7);
box.setObj(apple);
System.out.println(box.getObj());
Apple apple2 = (Apple) box.getObj();
// box.getObj의 타입은 Object이지만 Apple 타입에 대입하고자한다면
// (Apple)를 이용하여 강제 형변환 해줘야한다.
// Object 를 옳바른 타입으로 형변환해야하는 위험이 있기 때문에 제네릭이 나옴
System.out.println(apple2);
}
}
제네릭을 사용하는 이유
- 다양한 타입의 객체에 재사용을 높일 수 있는 방법
- 클래스에서 사용할 타입을 외부에서 설정
- 반복적인 코드, 불필요한 코드를 사용하지 않도록 재활용 가능
- 강제적인 타입 변환을 발생 시키지 않음
public class Box<T>{
private T num1;
private T num2;
public T plus(T num1, T num2){
return num1 + num2;
}
}
-------------------------------------
Box<Integer> box = new Box();
사용 방법
- 클래스 또는 인터페이스에 <>를 붙이고 타입 파라미터를 지정
- <>안에는 클래스 타입이 들어가야함
타입 뜻
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number
제네릭을 사용할 수 없는 경우
- 제네릭으로 배열을 생성할 수 없음
- static 변수를 제네릭으로 사용할 수 없음
추상클래스(abstract)
- 클래스의 용도가 객체 생성 용도로 사용할 수 없음
-추상 메소드를 한개 이상 가지고 있는 클래스public : 모든 외부에서 직접 접근하거나 호출 (추상 메소드 : 자식 클래스에서 반드시 오버라이드 해야하는 메소드)
-변수의 타입으로 선언하는 용도와 상속의 본연의 기능으로 특정한 코드를 하위 클래스로 물려주기 위해 생성
-추상 클래스는 자식 클래스에서 상속을 해야 사용가능하기 때문에 자식 클래스는 다른 클래스를 상속 받을 수 없음 (자바는 단일 상속)
abstract class Abstract1 {
// 추상클래스를 만드려면 적어도 1개 이상의 추상 메소드가 존재해야한다.
public abstract int plus(int num1, int num2); // 추상메소드
}
// -------------------------------------------------------------------
public class Abstract2 extends Abstract1{
// Abstract1에 있는 추상 메소드를 반드시 오버라이딩 해야함
@Override
public int plus(int num1, int num2) { // 추상메소드 구현
return num1 + num2;
}
}
// -------------------------------------------------------------------
public class Main1 {
public static void main(String[] args) {
// 추상 클래스를 직접적으로 객체 생성이 불가능하며 추상클래스를 구현한 구현 클래스의 객체를 생성해야함
// Abstract1 abstract1 = new Abstract1();
Abstract2 abstract2 = new Abstract2();
int result = abstract2.plus(10,5);
System.out.println(result);
}
}
final 키워드
- 클래스, 변수, 메소드에서 사용하는 키워드로 변할 수 없는 상태를 나타냄
- final 클래스는 상속할 수 없음
fianl class Class1{
...
}
class Class2 extends Class{ // 에러!
...
}
- final 변수는 값을 재할당 할 수 없음
final String str = "Apple";
str = "Banana"; // 에러!
- final 메소드는 오버라이딩 할 수 없음
class Class1{
final String method1(){
return "안녕하세요!";
}
}
public class Class2 extends Class1{
String method1(){ // 에러!
return "안녕하세요!";
}
}
인터페이스(interface)
- 자바는 다중상속을 지원하지 않으므로 인터페이스를 사용해서 다중상속을 구현
- 다른 클래스를 작성할대 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 매개 역할을 담당하는 일종의 추상클래스와 비슷
- 인터페이스는 추상 메소드와 상수만을 포함 할 수 있음 -> 인스턴스 메소드, static메소드도 포함(JDK8)
인터페이스 작성
접근제어자 interface 인터페이스명{
public static final 타입 상수명 = 값;
public abstract 메소드명(매개변수1, 매개변수2...);
}
인터페이스의 모든 필드는 public static final 이여야함 인터페이스의 모든 메소드는 public abstract 이여야함함
인터페이스 구현
class 클래스명 implements 인터페이스명{
}
🎁 자바의 상속과 인터페이스의 구현을 동시에 하려면
class 클래스명 extends 부모클래스명 implements 인터페이스명{
...
}
🎁 여러개의 인터페이스를 구현하려면
class 클래스명 extends 부모클래스명 implements 인터페이스명, 인터페이스명, 인터페이스명 ... {
...
}