4 분 소요

래퍼 클래스(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 인터페이스명, 인터페이스명, 인터페이스명 ... {
            ...
        }

태그:

카테고리:

업데이트: