클래스, 객체, 인스턴스의 개념을 잘 이해를 해야
올바르다고 할 수 있는 객체지향적인 프로그래밍을 할 수 있다고 생각한다.

클래스, 객체, 인스턴스의 개념

클래스(Class)란

  • 개념
    • 객체를 생성하기 위한 설계도 혹은 틀
    • 서로 관련 되어 있는 메서드의 집합
    • 객체들의 속성을 묶어 놓은 집합체

객체란(Object)란

  • 개념
    • 객체를 다양하게 표현하지만 나는 클래스에 정의된 내용대로 생성된 것이라 생각한다.
    • 객체는 속성과 동작으로 이루어져 있다.
  • 특징
    • OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.
    • 클래스로부터 만들어진 객체를 '클래스의 인스턴스(Instance)라고도 부른다.

인스턴스(Instance)란

  • 개념
    • OOP에서 어떤 클래스에 속하는 객체를 인스턴스라고 부른다.
    • 클래스로부터 생성된 객체를 인스턴스라 생각하면 쉬울것이다.
  • 특징
    • 객체가 만들어지는 과정을 클래스의 인스턴스화라고 한다.
    • 클래스와 인스턴스는 같은 의미이기에 이 둘을 문맥에 따라 구별하는 것이 맞다.
      ex) 책상은 객체이다, 책상은 책상 클래스의 인스턴스이다.

클래스 예제

  • 앞서 말한것처럼 클래스는 객체를 만들기위한 설계도이다.
    객체는 속성과 기능 이 두가지의 구성요소로 이루어져 있는데
    속성을 멤버변수, 기능을 메서드(함수)라고 자주 부른다.
public class Student {

    //멤버 변수
    String name;
    int number;
    int grade;

    // 메서드(함수)
    public void getGrade() {
        grade += 10;
    }

    public static void main(String[] args) {
        Student student1 = new Student(); // 객체를 생성할때는 new 연산자를 통해 생성한다.
                                          // Student()는 생성자를 호출한다는 의미이다.(생성자는 좀 이따 설명)
        student1.name = "영희";
        student1.number = 1;
        student1.grade = 80;

        System.out.println("학생의 이름은 " + student1.name);
        System.out.println("학생의 번호는 " + student1.number);
        System.out.println("학생의 성적은 " + student1.grade);

        student1.getGrade();

        System.out.println("학생의 성적은 " + student1.grade);

    }
}

실행결과
학생의 이름은 영희
학생의 번호는 1
학생의 성적은 80
학생의 성적은 90

저런식으로 코드를 작성할 시 문제점이 무엇일까?
바로 귀찮다는 것이다. 일일이 객체의 속성을 지정해서 출력을 해주는 일은 귀찮을 뿐더러
보기에도 이쁘지가 않다.
그래서 클래스에는 생성자(Constructor)라는 것이 있다.

생성자(Constructor)

생성자는 new 연산자를 통해 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메서드라고 생각하면 편하다.(메서드와 비슷하지 그 의미가 같은 것은 아니다) 생성자는 멤버 변수를 초기화하는 역할을 한다.

생성자 선언 방법

생성자 선언 방법

생성자는 위 그림과 같이 선언 하는데 파란 글씨는 굳이 적지 않아도 되고 빨간 부분만 반드시 적어야한다.
그리고 생성자는 리턴 값이 없다.
즉 생성자는 다음과 같이 선언할 수 있다.

class Student {
    Student() {} // 매개변수가 없는 생성자

    Studnet(String name, int number){} // 매개변수가 있는 생성자
}

그런데 아까 우리가 작성한 예제 코드에서는 생성자를 선언하지 않았는데 객체가 잘 생성되었다.
그 이유가 무엇일까?
그것은 생성자를 선언하지 않으면 컴파일러에서 자동으로 기본 생성자(Default Constructor)를 생성해주기 때문이다. 기본 생성자는

public Class() {}

다음과 같은 형태가 기본 생성자이다. 기본 생성자는 생성자가 하나도 없을 경우 생성해 주기 때문에 이에 유의하면서 코드를 작성해야 한다.
예제를 통해 생성자에 대해 살펴보자.

public Student() {
        name = "학생";
        number = 100;
        grade = 0;

        System.out.println("학생의 이름은 " + name);
        System.out.println("학생의 번호는 " + number);
        System.out.println("학생의 성적은 " + grade);
    }

    public static void main(String[] args) {
        Student student1 = new Student();

    }

방금 작성한 코드를 다음과 같이 조금 고쳐보자
그러면 실행 결과가 다음과 같이 나올 것이다.

실행결과
학생의 이름은 학생
학생의 번호는 100
학생의 성적은 0

조금 감이 잡힐 것이다. 그렇다면 이제 매개변수를 받는 생성자를 만들어서
우리가 원하는 학생 객체를 만들어 보자.

번호가 1이고 성적은 50인 영희학생과 번호가2이고 성적은 40인 철수학생을
매개변수를 받는 생성자를 이용해 만들어보자

public Student(String studentName, int studentNumber, int studentGrade) {
        name = studentName;
        grade = studentNumber;
        number = studentGrade;

        System.out.println("학생의 이름은 " + name);
        System.out.println("학생의 번호는 " + number);
        System.out.println("학생의 성적은 " + grade);
    }

    public static void main(String[] args) {
        Student student1 = new Student("영희", 1, 50);
        Student student2 = new Student("철수", 2, 40);
    }

(실행결과는 따로 적지 않겠습니다.)

이 정도 코드면 클래스와 생성자에 대해 어느 정도 감이 잡혔으리라 생각된다.
물론 내가 작성한 포스트로 '클래스와 생성자가 이런거구나'라고 깨닫는 사람은 없을 것이다.
나도 클래스에 대한 부분을 작은 프로젝트를 여러개 만들어보고 난 후
객체지향적인 코드를 작성하게 되었다.
많은 사람들이 조급해 하지말고 천천히 공부하고 또 많은 경험을 통해 실력을 늘렸으면 좋겠다.