Class와 Interface

ymk·2023년 6월 9일
0
post-thumbnail

🔎 Nested Class란?

Nested Class(내부 클래스)란 클래스내에 있는 클래스를 뜻한다.
이를 사용하는 이유는 몇가지가 있다.

1. 소스의 가독성과 유지보수성을 높이기 위해
2. 한 곳에서만 사용되는 클래스를 논리적으로 묶어서 처리하기 위해
3. 캡슐화를 위해(내부 구현을 감추고 싶을 때)

이러한 Nested Class에도 Static nested class, inner class (local, anonymous) 로 종류가 나누어져 있다.

Static Nested Class

public class OuterOfStatic {
    static class StaticNested{
        private int value=0;
        public int getValue(){
            return value;
        }
        public void setValue(int value){
            this.value=value;
        }
    }
}

OuterOfStatic 클래스를 컴파일하면 내부의 클래스도 컴파일 된다.

Static Nested Class 객체를 바로 생성할 수 있다.

public class NestedClassClient {
    public static void main(String[] args){
        NestedClassClient client = new NestedClassClient();
        client.makeStaticNestedObj();
    }
    public void makeStaticNestedObj(){
        OuterOfStatic.StaticNested staticNested = new OuterOfStatic.StaticNested(); // 여기
        staticNested.setValue(3);
        System.out.println(staticNested.getValue());
    }
}

Inner Class

Inner Class는 처음 코드 StaticNested 클래스에서 static 선언을 지운다.

public class OuterOfInner {
    class Inner{
        private int value=0;
        public int getValue(){
            return value;
        }
        public void setValue(int value){
            this.value=value;
        }
    }
}

Inner Class의 객체는 해당 클래스를 감싸는 Outer 클래스를 먼저 생성하고 Outer 객체를 통해 만들어야한다.

public class NestedClassClient {
    public static void main(String[] args){
        NestedClassClient client = new NestedClassClient();
        client.makeInnerObject();
    }
    
    public void makeInnerObject(){
        OuterOfInner outer = new OuterOfInner(); // 여기
        OuterOfInner.Inner inner = outer.new Inner();
        inner.setValue(3);
        System.out.println(3);
    }
}

특히 내부 클래스는 하나의 클래스에서 어떤 공통적인 작업을 수행하는 클래스가 필요한데 다른 클래스에서는 그 클래스가 전혀 필요 없을 때 사용된다.


🧩 Interface와 abstract class 차이

abstract class(추상 클래스)란?

추상클래스는 추상 메서드를 선언하여 상속을 통하여 자손 클래스를 완성하도록 유도하는 클래스이다. 따라서 보통 이를 미완성 설계도라고 표현한다. Abstract class는 애초에 상속(extends)을 위한 클래스이므로 따로 객체를 생성할 수는 없다.

abstract class Basic {
	...
    public abstract void meth();
}

Interface란?

인터페이스는 기본 설계도라고 표현할 수 있다. 인터페이스 또한 추상클래스처럼 다른 클래스를 작성하는 것에 도움을 주는 목적으로 작성하고 추상클래스와는 다르게 다중 상속을 할 수 있다(implements). 인터페이스 역시 객체를 생성할 수 없다.

interface plan {
    public static final HIGH = 300;
    public abstract void run(); // public abstract는 항상 있고 생략 가능
}

이 둘은 상당히 비슷해 보이지만 적용하는 것에서는 차이점이 있다. 추상 클래스는 extends(상속, 확장의 느낌) 키워드 그대로 자신의 기능들을 하위로 확장시키는 것으로 볼 수 있고, 인터페이스는 implements(상속, 구현의 느낌) 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 동일한 기능으로 구현하는 것으로 볼 수 있다.

또 다른 관점에서는 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜놓은 것으로 상속 관계를 타고 올라갔을 때, 같은 부모 클래스를 상속하며, 부모 클래스가 가진 기능들을 구현해야 하는 경우에 사용한다.

반면 인터페이스는 상속 관계를 타고 올라갔을 때, 다른 부모 클래스를 상속하더라도 같은 기능이 필요한 경우에 사용된다. 즉 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.

'is a kind of(~의 한 종류) 추상 클래스'
'be able to(~할 수 있는) 인터페이스'


📌 객체, 클래스, 인스턴스

🔵 객체

자바를 최초로 개발한 개발자인 제임스 고슬링이 작성한 자바 언어 설명서에 따르면 객체란 클래스의 인스턴스나 배열을 말한다고 한다.

객체지향 프로그래밍에서 객체는 변수, 함수, 자료 구조의 조합이 될 수 있는데, 특히 객체지향 프로그래밍에서 클래스를 기반으로 한 변수를 클래스의 인스턴스라고 지칭한다.

🔵 클래스

객체지향 프로그래밍에서 클래스는 멤버 변수와 메서드를 가지는 객체를 만들기 위한 확장이 가능한 코드 양식이다. 즉 객체를 찍어내기 위한 설계도라고 말할 수 있다.

🔵 인스턴스

인스턴스란 설계도(클래스)를 바탕으로 실체화되어 메모리에 할당된 실체를 말한다. 객체와 비슷하게 느껴질 수 있는데, 차이점으로 객체는 소프트웨어 세계에 구현할 대상이고, 설계도에 따라 소프트웨어 세계에 구현된 실체가 인스턴스다. 따라서 인스턴스는 객체에 포함되어있다고 볼 수 있다.


Reference

https://www.geeksforgeeks.org/local-inner-class-java/

https://onsil-thegreenhouse.github.io/programming/java/2017/12/12/java_tutorial_1-16/

https://upcake.tistory.com/418

profile
개발 공부 일지

0개의 댓글