1. 인터페이스와 추상클래스의 차이점
  2. 클래스와 객체의 차이점
  3. 정적(static)이란
  4. 자바의 원시 타입들은 무엇이 있으며 각각 몇 바이트인가
  5. 접근 제어자의 종류와 이에 대해 설명
  6. 객체지향에 대해서 설명

1. 인터페이스와 추상클래스 차이점

인터페이스(interface)

  • 클래스가 특정 메서드들을 구현하도록 강제하는 일종의 계약
  • 메서드의 선언만 포함하고 구체적인 구현은 포함하지 않음
  • 클래스간의 일관성을 유지하고 다형성을 구현하는 데 도움
  • interface 키워드로 선언

인터페이스 특징

  • 메서드 선언 : 인터페이스 안에 선언된 메서드는 public과 abstract, 모든 메서드는 구현없이 선언만 포함
  • 필드 : 인터페이스 내 필드는 기본적으로 public, static, final, 상수로만 존재할 수 있음
  • 다중 구현 : 다중 상속을 지원하지 않지만, 하나의 클래스가 여러 인터페이스를 구현할 수 있음
  • 디폴트 메서드 : default 키워드를 사용하여 인터페이스 내 메서드 기본 구현 제공 가능
  • 정적 메서드 : 정적 메서드도 포함 가능
  • 함수형 인터페이스 : 추상 메서드가 하나만 있는 인터페이스는 함수형 인터페이스로 사용 가능 (Runnable, Callable)
public interface Animal {
    void makeSound(); // 추상 메서드
}
 
public class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof! Woof!");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.makeSound(); // 출력: Woof! Woof!
    }
}
 

추상 클래스(Abstract class)

  • 다른 클래스들이 상속받아야 할 공통의 기능과 속성을 정의하는데 사용
  • 하나 이상의 추상 메서드와 일반 메서드 모두 포함 가능
  • 추상 클래스 자체는 인스턴스화 할 수 없으며, 상속받은 클래스가 추상 메서드를 구현하여 사용 가능

추상클래스 특징

  • abstract 키워드 사용
  • 추상 메서드 : 구현 없이 메서드 선언만 포함된 메서드, 상속받는 클래스가 해당 메서드를 반드시 구현해야 함
  • 일반 메서드 포함 가능 : 코드 재사용성 높음
  • 필드 : 인스턴스 필드와 메서드를 포함해 상속받는 클래스들이 공통으로 사용 가능
  • 생성자 : 생성자를 가질 수 있음, 상속받는 클래스의 객체가 생성될 때 고옹된 초기화 코드 사용 가능
  • 상속 : extends 키워드를 통해 상속, 하나의 클래스만 상속받을 수 있음
public abstract class Animal {
    private String name;
 
    // 일반 메서드
    public void eat() {
        System.out.println(name + " is eating.");
    }
 
    // 추상 메서드 (구현 없음)
    public abstract void makeSound();
 
    // 생성자
    public Animal(String name) {
        this.name = name;
    }
}
 
public class Dog extends Animal {
    public Dog(String name) {
        super(name); // 부모 클래스의 생성자 호출
    }
 
    @Override
    public void makeSound() {
        System.out.println("Woof! Woof!");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog("Buddy");
        myDog.eat(); // 출력: Buddy is eating.
        myDog.makeSound(); // 출력: Woof! Woof!
    }
}
 

Question

인터페이스와 추상 클래스의 차이점은 무엇인가요?

인터페이스는 클래스가 특정 기능을 구현하도록 강제하며 다중 구현이 가능하지만, 추상 클래스는 공통된 속성과 메서드를 상속하여 코드 재사용성을 높이고 단일 상속만 가능합니다.

Question

Java 8 이후 인터페이스의 역할은 어떻게 변화했나요?

Java 8 이후, 인터페이스는 default 메서드와 static 메서드를 통해 일부 구현을 포함할 수 있게 되어, 인터페이스에 새로운 메서드를 추가해도 기존 구현체에 영향을 주지 않을 수 있습니다.

2. 클래스와 객체의 차이점

클래스

  • 객체를 정의한 설계도
  • 객체를 생성하는데 사용

객체

  • 클래스에 의해 정의되고 설계된 내용을 기반으로 생성
  • 속성과 행위를 가짐
  • 실제로 사용할 수 있는 주체
  • 속성은 필드, 행위는 메서드에 해당
  • 클래스를 통해 생성된 객체를 클래스의 인스턴스라 부름

Question

클래스와 객체의 차이점은 무엇인가요?

클래스는 객체를 생성하기 위한 설계도이며, 객체는 클래스에 의해 생성되어 메모리상에 할당된 인스턴스입니다. 예를 들어 Car 라는 클래스는 자동차를 설계하는 틀이고, 이를 통해 생성된 자동차는 객체입니다.

Question

객체의 상태와 행동을 어떻게 정의하나요?

객체의 상태는 클래스 내의 필드(멤버 변수)로 정의되며, 행동은 메서드로 정의됩니다. 예를 들어 Car 객체의 상태는 color, model, speed 이고 행동은 drive(), stop() 메서드 입니다.

3. 정적(static) 이란

  • static = 고정된
  • static 변수와 static 메서드 생성 가능 (=합쳐서 정적 멤버)
  • 정적 멤버는 객체가 아닌 클래스에 고정
  • heap 영역이 아닌 static 영역에 할당되어 모든 객체가 공유하여 참조할 수 있지만 GC의 관리 영역 밖이기 때문에 static 영역의 멤버들은 프로그램 종료시까지 메모리가 할당된 채로 존재하게 됨
  • 정적 멤버 선언 기준 = 공용으로 사용하는가 / 사용하지 않는가

Question

static 키워드는 무엇이며, 언제 사용되나요?

static은 클래스 수준에서 공유되는 필드나 메서드를 정의할 때 사용됩니다. 특정 인스턴스가 아닌 클래스 자체에 속해 모든 객체가 공유합니다.

Question

static을 많이 사용하게 되면 발생하는 성능상의 문제는 무엇인가요?

static으로 정의된 정적 멤버들은 heap 영역이 아닌 static 영역에 할당되어 Garbage Collector의 관리 영역 밖에 존재하기 때문에 프로그램 종료시까지 메모리가 할당된 채로 존재하게 되어 시스템에 악영향을 줄 수 있습니다.

4. 자바의 원시 타입들은 무엇이 있으며 각각 몇 바이트인가

자바 데이터 타입

원시 타입
  • 논리형, 문자형, 정수형, 실수형 등의 실제 데이터(값)을 저장하는 타입
참조 타입
  • 객체가 생성된 메모리의 주소를 저장하는 타입

Question

자바의 원시타입과 참조타입의 차이는?

원시 타입은 Null을 담을 수 없지만 참조 타입은 Null 입력이 가능합니다. 원시 타입은 제네릭 타입에서 사용할 수 없지만 참조 타입은 제네릭 타입에서 사용할 수 있습니다.

원시 타입은 스택 메모리에 값을 저장하고 참조 타입은 참조값은 스택 메모리, 실제 값은 힙 메모리에 존재합니다. 그리고 참조 타입의 값이 필요할 때마다 언박싱 과정을 거쳐야 해 접근 속도가 느려지게 됩니다.

원시타입이 사용하는 메모리참조타입이 사용하는 메모리
boolean - 1bitBoolean – 128 bits
byte - 8bitsByte - 128bits
short, char - 16bits = 2byteShort, Charater - 128bits
int, float - 32bits = 4byteInteger, Float - 128bits
long, double - 64bits = 8byteLong, Double - 196bits

5. 접근 제어자의 종류와 이에 대해 설명

  • 클래스, 변수, 메소드 및 생성자에 대한 접근 수준을 설정하는 데 사용
  • 객체 지향 프로그래밍의 캡슐화 원칙을 구현하며 클래스 내부의 데이터를 보호하고 무분별한 접근 제한

private

  • 가장 제한적인 접근 수준
  • 해당 클래스 내에서만 접근이 가능하며 외부 클래스나 상속받은 클래스에서 접근 불가

default

  • 같은 패키지 내의 클래스들만 접근 가능
  • 패키지 단위의 캡슐화 제공
  • 패키지 내부에서의 데이터 공유에 유용함

protected

  • 같은 패키지 내의 클래스 도는 다른 패키지의 상속받은 클래스에서 접근 가능
  • 상속받은 클래스가 부모 클래스의 특정 멤버에 접근할 수 있도록 하기 위해 존재

public

  • 가장 개방적인 접근 수준
  • 어떤 클래스에서든 접근 가능

Question

protected와 default의 차이점?

protected는 같은 패키지 내에서, 다른 패키지여도 상속받은 클래스에서 접근이 가능하지만 default는 같은 패키지 내에서만 접근 가능합니다.

6. 객체지향에 대해서 설명

절차적 프로그래밍

  • 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법
  • 실행속도가 빠르고, 프로그램 흐름을 쉽게 추적할 수 있음
  • 유지보수가 어렵고 실행순서가 정해져있어 순서가 바뀌면 동일한 결과를 보장하기 어려움

객체 지향 프로그래밍

  • 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법
  • 모듈화, 캡슐화로 인해 유지 보수에 용이
  • 객체 = 하나의 프로그램으로 재사용에 용이
  • 속도가 상대적으로 느리고 메모리를 많이 사용함
  • 코드 설계와 작성에 많은 시간 소요

객체 내부에 자료형 필드와 함수가 함께 존재함 = 코드 가독성 증가, 유지보수 용이 객체들을 조합해서 하나의 프로그래밍으로 만드는 것 = 객체지향 프로그래밍

데이터를 객체로 모델링하고, 해당 객체들이 상호작용하며 프로그래밍이 동작하도록 설계하는 패러다임

객체지향 프로그래밍의 4가지 특성

추상화(Abstraction)
  • 불필요한 세부사항을 숨기고 중요한 부분만 드러내는 개념
  • 인터페이스나 추상 클래스를 통해 이루어짐
캡슐화(Encapsulation)
  • 객체의 상태와 행동을 하나의 단위로 묶어 외부에서 객체의 내부 구조에 접근하지 않도록 보호하는 개념
  • 데이터 은닉을 구현하고, 유지보수를 용이하게 함
상속(Inheritance)
  • 이미 정의된 클래스의 특성과 기능을 자식 클래스가 물려받아 사용할 수 있는 개념
  • 코드의 재사용성을 높이고 중복을 줄임
다형성(Polymorphism)
  • 같은 메서드나 연산자가 다양한 방식으로 동작할 수 있는 특성
  • 부모 클래스의 메서드를 자식 클래스가 재정의하여 다르게 동작하도록 할 수 있음
  • 오버로딩, 오버라이딩

Question

객체지향 프로그래밍의 4가지 특성은 무엇인가요?

추상화, 캡슐화, 다형성, 상속입니다.

추상화는 불필요한 세부사항을 숨기는 개념으로 인터페이스나 추상클래스를 통해 구현할 수 있습니다. 캡슐화는 객체의 상태와 행동을 하나의 단위로 묶는 개념입니다. 상속은 이미 정의된 클래스의 특성과 기능을 자식 클래스가 물려받아 사용하는 개념입니다. 다형성은 같은 메서드나 연산자가 다양한 방식으로 동작할 수 있는 개념으로 오버로딩이나 오버라이딩을 통해 구현할 수 있습니다.