[CS] 클래스 vs 객체 vs 인스턴스, static, 오버로딩, 오버라이딩, 추상화

최지나·2023년 10월 14일
3

CS

목록 보기
5/55
post-thumbnail

클래스 vs 객체 vs 인스턴스

1. 클래스

  • 정의: 객체를 만들어내기 위한 틀. 만들어 낼 객체의 속성과 메서드의 집합을 담아놓은 것.
  • 예시:
class Person {
    String name;
    int age;

    // constructor, methods, etc.
}

2. 객체

  • 정의: 클래스로부터 만들어지는 실체. 클래스로 선언된 변수.

3. 인스턴스

  • 정의: 객체가 메모리에 할당된 상태이며 런타임에 구동되는 객체. 객체와 같은 의미로 쓰임.
Person b;
// 변수 선언 시 객체가 됨
b = new Person("지나", 1, 1000);
// 객체가 메모리에 할당되는 순간 인스턴스화

4. 예시

class Coffee {
    // 속성(멤버 변수)
    private String type;
    private int size;

    // constructor
    public Coffee(String type, int size) {
        this.type = type;
        this.size = size;
    }
    
    // Coffee c = new Coffee(); 시 default로 생성되는 객체
    public Coffee() {
        this.type = "에스프레소";
        this.size = 1;
    }


    // 동작(메서드)
    public void describe() {
        System.out.println("주문한 커피 - 종류: " + type + ", 크기: " + size + "oz");
    }
}

public class CoffeeShop {
    public static void main(String[] args) {
        Coffee espresso = new Coffee();  // 객체 > 인스턴스
        Coffee latte; // 객체
        latte = new Coffee("라떼", 12);  // 인스턴스

        espresso.describe();
        latte.describe();
    }
}
  • constructor: 클래스의 인스턴스(객체)를 초기화하는 특별한 메서드로 이름이 클래스의 이름과 동일하며 리턴 타입이 존재하지 않는다

static 키워드의 사용과 장단점

1. 개요

  • 정의: 클래스에 속하며 클래스의 변수, 메서드 등을 공유하는데 사용.
  • 장점:
    객체를 생성하지 않고도 클래스 자체에서 메서드를 호출하거나 변수에 접근 가능.
    중복 데이터 생성 방지, 메모리 효율적 활용.
  • 단점:
    프로그램이 종료될 때까지 GC에 의해 메모리가 회수되지 않음.
    공유 자원이기 때문에 동기화에 신경써야 함.

2. static 예시

public class Person {
    // 멤버변수(속성)
    String name;
    int IQ;
    int str;
    private static final String WORD = "공부해";

    // constructor, methods, etc.

    // static 메서드
    private static void talk(Person a, Person b) {
        System.out.println(a.name + " & " + b.name + "이 대화를 시작했다!");
    }

    public static void main(String[] args) {
        Person a = new Person(); // 객체 >> 인스턴스
        a.levelUp();
        Person b; // 객체
        b = new Person("지나", 1000, 1); // 인스턴스
        b.levelUp();
        Person.talk(a, b);
        System.out.println(Person.WORD);
    }
}

오버로딩과 오버라이딩

1. 오버로딩 (Overloading)

  • 정의: 같은 이름의 메서드를 매개변수의 타입, 개수, 순서를 다르게하여 여러 버전을 가질 수 있는 것.
  • 예시:

class Calculator {
    // 오버로딩 매개변수의 개수, 타입을 다르게 정의 가능
    void multiply(int a, int b) {
        System.out.println("결과는 : " + (a * b) + "입니다.");
    }

    void multiply(int a, int b, int c) {
        System.out.println("결과는 : " + (a * b * c) + "입니다.");
    }

    void multiply(double a, double b) {
        System.out.println("결과는 : " + (a * b) + "입니다.");
    }

    // 오버로딩 매개변수의 순서를 바꿀 수도 있다
    void pay(String a, int b) {
        System.out.println(a + "가 " + b + "원만큼 계산합니다. ");
    }

    void pay(int a, String b) {
        System.out.println(b + "가 " + a + "원만큼 계산합니다. ");
    }
}

2. 오버라이딩 (Overriding)

  • 정의: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의하는 것. 상속 관계에서 사용되며 static, final로 선언한 메서드는 오버라이딩이 불가능.

  • 예시:

class Animal {
    void eat() {
        System.out.println("먹습니다.");
    }
}

// 오버라이딩
class Person extends Animal {
    @Override
    void eat() {
        System.out.println("사람처럼 먹습니다. ");
    }
}
  • 인터페이스를 기반으로 여러 하위 클래스에서 오버라이딩을 할 수도 있음.
interface Animal {
    void eat();
}

class Person implements Animal {
    @Override
    public void eat() {
        System.out.println("사람처럼 먹습니다. ");
    }
}

추상화

  • 정의: 복잡한 데이터, 구조, 시스템 등으로부터 핵심만을 가려내 덜 자세하게 만드는 것. 또는 세부사항, 절차 등을 감추고 인터페이스 등을 만드는 것으로 복잡도를 낮추는 방법.
  • 데이터 추상화: 공통점을 모아 공통의 개념을 만들어내는 것. 예를 들어, 동물이라는 추상 클래스에서 동물들의 공통 메서드를 정의하고 실제 동물들은 이를 상속받아 구체화.
  • 프로세스 추상화: 내부 동작을 감추고 단순한 인터페이스를 제공하는 것. 사용자는 내부 동작을 몰라도 간단한 명령으로 프로세스를 수행할 수 있음.
// 데이터 추상화
abstract class Animal {
    public abstract void animalSound();

    public void sleep() {
        System.out.println("zzz");
    }
}

class Cat extends Animal {
    public void animalSound() {
        System.out.println("야옹");
    }
}

class Dog extends Animal {
    public void animalSound() {
        System.out.println("왈왈");
    }
}


REF

profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글