study/Java

[sist] 2024.01.18_Java : Interface, inner class, nested class, local class, anonymous inner class, 자주 사용하는 클래스들

듀2 2024. 2. 25. 20:45

* Interface

- 다중 상속의 장점(기능 확장이 편리하다 ↔ 단점 : 객체의 크기가 필요 이상 커질 수 있음, 부모가 모호함)을 사용하기 위해.

- 약결합(loosely coupled)을 구현하여 객체 간의 유연성을 높이기 위해서.

Interface

- 작성법)

  접근지정자 interface 인터페이스명 extends 부모인터페이스명 ,,, {}

  접근지정자 - public : 외부 패키지에서 접근 가능 / package : 패키지 내부에서만 접근 가능

- 인터페이스는 객체화가 되지 않는다. (생성자 없음)

public interface 인터페이스명{
    상수
    abstract method();	// 구현클래스가 반드시 Override 해야 할 일의 목록
    default method(){}	// 인터페이스가 기능을 제공해야 할 때(JDK 1.8에서부터 지원)
}

 

- 클래스는 implements 키워드를 사용하여 인터페이스를 구현하여 사용.

public class 클래스명 implements 인터페이스명{
    abstract method의 override!!
}

 

구현
인터페이스는 상속

 

- 클래스에서 인터페이스를 구현한다. 구현하는 인터페이스 상속 줄에 있는 모든 abstract method는 구현 클래스에서 반드시 Override 해야 한다.


* inner class

- 이벤트를 처리하기 위한 목적으로 만들어진 클래스.

- JDK 1.2에서부터 지원.

- 안쪽 클래스에서는 바깥 클래의 자원을 마음대로 사용할 수 있지만, 바깥 클래스에서는 안쪽 클래스의 자원을 사용하려면 반드시 객체화하여 사용한다.

- 안쪽 클래스를 인스턴스 변수처럼 사용할 때 정의.

Inner class

* 컴파일하면 bytecode가 생성된다.

 - 바깥클래스명.class -> 바깥클래스명$안쪽클래스.class가 생성된다.

 - $ : 자바 언어 외부에서 자바 언어 내부를 지칭하는 기호

 

* 객체화

 1. 바깥 클래스의 객체화

바깥클래스명 객체명 = new 바깥클래스생성자();

Outter out = new Outter();

 

2. 바깥 클래스의 객체를 사용하여 안쪽 클래스를 객체화

바깥클래스명.안쪽클래스명 객체명 = 바깥클래스의객체명.new 안쪽클래스의 생성자();

Outter.Inner in = out.new Innner();

// instance 영역은 바깥클래스의 객체명 대신 this를 사용할 수 있다. 생략도 가능하다.
Outter.Inner in = this.new Inner();
OUtter.Inner in = new Inner();

 


* Nested Class

- 안쪽 class를 static 변수처럼 사용할 때. (객체화하지 않고 사용하기 위해 생성. instance 영역을 만들지 않는다.)

- 안쪽 클래스는 모두 static으로 만든다.

class Test{
    // instance 영역
    int i;
    
    public void test(){
    
    }
    
    static class In{
    	// instance 영역
    	static int j;
        public static void temp(){
        
        }
    }
}

Nested Class


* Local Class

- method 안에서 class를 정의할 때.

- 생성된 인스턴스는 method 안에서만 사용된다.

- local class에서는 지역변수를 사용할 때 final이 붙어 있는 지역변수만 사용할 수 있다.

- class를 지역변수처럼 사용할 때 사용.

Local Class

- 컴파일을 수행하면 바깥클래스명.class, 바깥클래스명$1로컬클래스명.class 두 개의 바이트가 생성된다.

 


* anonymous inner class

- 이름이 없는 클래스.

- 클래스를 arguments로 사용할 때.

- 클래스 파일을 별도로 생성하지 않고, 부모 클래스를 사용하여 객체로 만들어야 할 때.

anonymous inner class

- 컴파일을 수행하면 외부클래스명.class, 외부클래스명$1.class 두 개의 bytecode가 생성된다.

- method의 parameter가 인터페이스(클래스)를 선언하면 해당 인터페이를 구현하는 클래스를 만들고(is a) 객체를 생성하여 arguments로 넣어줘야 한다. => 이 method가 프로그램 실행 중 딱 한 번만 호출되는 상황이라면 anonymous inner class 사용

 


* 자주 사용하는 class들

- 문자열 관련 : String, StringBuffer, StringBuilder, StringTokenizer

- 수학 : Math

- 날짜 : Date, Calendar

- formatter : SimpleDateFormat, DecimalFormat

- 난수 : Random

- 지역 : Locale

 

* String

- 짧은 문자열을 다룰 때 사용

- 문자열 안에서 특정 문자를 기준으로 잘라내어 배열로 저장할 때.

String csvData = "Java,Oracle,JDBC,HTML";
// Comma Seperated Value : , 또는 일정한 문자로 구분되어진 값
String[] arr = csvData.split(",");	// "구분할문자열"

 

* Math

- 생성자가 없으므로 객체화될 수 없는 클래스.

- 객체 값을 저장하지 않고 method에 입력값으로만 업무를 처리하는 클래스

// 절대값
양수 = Math.abs(음수);

// 반올림
정수형 변수명 = Math.round(실수);

// 올림
실수 = Math.ceil(실수);

// 내림
실수 = Math.floor(실수);

// 절사 -> method 없음
(int)실수

// 난수
double = Math.random();

// 난수는 보통 아래와 같이 사용
(int)(Math.random()*발생할수)

 

 

728x90