[Java] 클래스와 객체 + Python과 비교

전주은·2023년 3월 5일
0
post-thumbnail

✔ 클래스와 객체의 개념과 차이점

  • 클래스(class)는 객체(object)를 만들기 위한 설계도(blueprint)이며, 객체는 클래스의 인스턴스(instance)이다.
  • 클래스는 객체를 만들기 위한 변수와 메서드들을 정의하고, 객체는 클래스를 바탕으로 생성된다. 객체는 클래스에 정의된 변수와 메서드들을 사용할 수 있다.
  • 클래스는 추상적인 개념이며, 객체는 실제로 존재하는 구체적인 개념이다.
  • 클래스는 객체를 생성하기 위한 설계도이지만, 객체는 실제로 메모리상에 할당되어 사용된다.

    👀 인스턴스란?
    클래스(class)에서 정의된 틀을 바탕으로 실제로 메모리 상에 할당되어 생성된 것

✔ 클래스 변수와 인스턴스 변수

  • 클래스 변수는 클래스의 모든 인스턴스에서 공유되는 변수이며, 인스턴스 변수는 각 인스턴스마다 고유한 변수이다.
  • 클래스 변수는 static 키워드를 이용해 선언된다.(보통 상수나 공유되는 값들을 클래스 변수로 사용)
  • 클래스 변수는 클래스가 로드될 때 생성되며, 해당 클래스에 대한 인스턴스가 생성되기 이전에도 사용할 수 있다.
  • 인스턴스 변수는 클래스 내부에서 선언되며, 각 인스턴스마다 독립적인 값을 가지며 인스턴스마다 서로 다른 값을 가질 수 있다. 인스턴스 변수는 인스턴스가 생성될 때마다 초기화되며, 생성자를 통해 초기값을 설정할 수도 있다.
public class Car {
    private static int count; // 클래스 변수
    private String name; // 인스턴스 변수

    public Car(String name) {
        this.name = name;
        count++; // 클래스 변수 값 증가
    }

    public static int getCount() { // 클래스 메소드
        return count;
    }

    public String getName() { // 인스턴스 메소드
        return name;
    }
}

✔ 생성자와 메소드

  • Java에서 생성자(constructor)와 메소드(method)는 모두 클래스 내부에서 정의되는 함수(function)이며, 객체 지향 프로그래밍에서 중요한 역할을 수행한다.

생성자(Constructor)

  • 클래스로부터 객체를 생성할 때 호출되는 특별한 메소드이다.
  • 객체를 초기화하는 역할을 수행한다.
  • 객체를 생성하는 과정에서 생성자는 자동으로 호출되며, 객체를 생성할 때 인스턴스 변수의 초기값을 설정할 수 있다.
  • 생성자는 반환값을 갖지 않으며, 클래스 이름과 동일한 이름으로 정의된다.
public class MyClass {
    public MyClass() { // 생성자
        // 객체 초기화 코드
    }
}

메소드(Method)

  • 메소드는 클래스 내부에서 정의되어 있는 함수(function)이며, 객체의 동작을 정의하는 데 사용된다.
  • 메소드는 인자(argument)를 받을 수 있으며, 반환값을 가질 수도, 가지지 않을 수도 있다.
  • 메소드를 사용하여 객체의 상태를 변경하거나, 객체의 정보를 반환하는 등의 역할을 수행한다.
public class MyClass {
    public void myMethod() { // 메소드
        // 메소드 코드
    }
}
접근제어자 [static] 반환타입 메소드이름([매개변수1, 매개변수2...내가원하는 만큼]){
    메소드이름이 호출되면 실행할 문장;
    ...
    [return 반환값]
}
  • 다른 클래스의 static 메소드를 호출하는 법
    클래스명.메소드명()
  • static 이 없을땐 객체를 생성해서 사용해야한다.

    👀 인자(argument)란?
    함수나 메서드를 호출할 때 함수나 메서드에 전달되는 값

✔ 접근 제한자와 캡슐화

👀 접근 제한자(access modifier)란?
클래스의 멤버(변수, 메소드)에 대한 접근을 제한하는 키워드

접근제어자 종류

  1. private: 같은 클래스 내부에서만 접근 가능합니다.
  2. default(package-private): 같은 패키지 내부에서만 접근 가능합니다.
  3. protected: 같은 패키지 내부이거나 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근 가능합니다.
  4. public: 모든 클래스에서 접근 가능합니다.

👀 캡슐화(encapsulation)

  • 객체 지향 프로그래밍에서 객체의 데이터와 기능을 하나로 묶고, 외부에서 직접 접근하지 못하도록 정보를 은닉하는 것
  • 객체의 내부 구조를 외부에서 직접적으로 접근할 수 없도록 제한하는 것

자바에서는 private 접근 제한자를 이용하여 멤버 변수를 캡슐화할 수 있다.

Java vs Python

1. 클래스와 객체 생성

Java에서는 클래스와 객체를 따로 생성한다. 클래스를 먼저 정의하고, 객체를 생성하여 사용한다. 반면, Python에서는 클래스와 객체를 한꺼번에 생성한다. 클래스를 정의하는 것만으로 객체도 생성된다.

  • java예시
public class MyClass {
    int x = 5;
}

public class Main {
    public static void main(String[] args) {
        MyClass myObj = new MyClass();
        System.out.println(myObj.x);
    }
}
  • python 예시
class MyClass:
    x = 5

myObj = MyClass()
print(myObj.x)

2. 멤버 변수의 선언

Java에서는 클래스 내부의 멤버 변수를 명시적으로 선언해야 한다. 멤버 변수에 대한 접근은 getter/setter 메서드를 통해 이루어진다. 반면, Python에서는 멤버 변수를 클래스 내에서 선언하지 않고, 객체의 인스턴스 변수로 동적으로 추가할 수 있다. 그리고 멤버 변수에 직접 접근이 가능하다.

  • java 예시
public class MyClass {
    private int x;
    
    public int getX() {
        return x;
    }
    
    public void setX(int x) {
        this.x = x;
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myObj = new MyClass();
        myObj.setX(5);
        System.out.println(myObj.getX());
    }
}
  • python 예시
class MyClass:
    pass

myObj = MyClass()
myObj.x = 5
print(myObj.x)

3. 메서드 선언

Java에서는 메서드를 선언할 때 반환 값의 데이터 타입과 파라미터의 데이터 타입을 명시해야 한다. 반면, Python에서는 반환 값의 데이터 타입과 파라미터의 데이터 타입을 명시하지 않는다.

  • java 예시
public class MyClass {
    public int sum(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myObj = new MyClass();
        System.out.println(myObj.sum(5, 3));
    }
}

4.클래스 상속

Java에서는 클래스 상속을 명시적으로 선언해야 한다. 반면, Python에서는 클래스 선언 시 상속 받을 클래스를 지정할 수 있다.

public class Animal {
    String name;
    int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void move() {
        System.out.println("The animal is moving.");
    }
}

public class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void move() {
        System.out.println("The dog is running.");
    }

    public void bark() {
        System.out.println("Woof!");
    }
}
  • python 예시코드
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def move(self):
        print("The animal is moving.")

class Dog(Animal):
    def __init__(self, name, age):
        super().__init__(name, age)

    def move(self):
        print("The dog is running.")

    def bark(self):
        print("Woof!")

0개의 댓글