본문 바로가기
Programming/Java

[Java] 7. 클래스와 객체 (Part 1)

by Rayched 2022. 10. 28.

 

0. 개요

우리가 프로그래밍을 하다보면 변수에 여러 값을 담아야하는 경우가 많다.

다만 변수에는 값을 하나만 담을 수 밖에 없으며, 변수와 값의 자료형이 다르면 값을 담을 수 없다.

그래서 고안된 것이 '객체 (Object)'이다.

객체에는 정수, 실수, 논리형 등의 각기 다른 값들을 담는 것이 가능하다.

이러한 객체를 만들기 위해서 필요한 것이 '클래스 (Class)'이다.

 

https://rclogstorage.tistory.com/14

 

[Java] 0 - (1). 객체 지향 프로그래밍이란 무엇인가

앞에서 자바의 정의와 특징들을 설명할 때, 자바의 특징인 '객체지향 언어'라는 부분에 대해 설명하지 않고 넘어갔었다. 이번에는 객체 지향 언어, 객체 지향 프로그래밍에 대해 정리해보겠다.

rclogstorage.tistory.com

예전에 '객체 지향 프로그래밍'이라는 개념에 대해 다룰 때 클래스와 객체에 대해 설명을 한 적이 있었다.

다만 이 두 개념이 중점이 아니었기 때문에 간략하게 설명하고, 상세한 부분은 추후에 정리해서 업로드하기로 했었다.

따라서 이번에는 클래스와 객체에 대한 것을 정리했고, 이를 설명해보겠다.


1. 클래스 기본 개념

① 클래스(class)의 정의

- 객체를 만들기 위한, 일종의 설계도와 같은 개념

- 사용자가 직접 정의해서 사용 가능한 데이터 타입

- '객체(object)'는 "클래스라는 데이터 타입으로 만들어진 변수"라고 보면 될 것이다.

   클래스는 객체가 생성될 때 실체를 가지고, 객체를 통해서 클래스에 포함된 다양한 데이터를 활용할 수 있다.

- 클래스는 생성될 객체의 정보나 상태를 '필드(field)'에, 객체의 동작이나 기능을 '메소드(method)'에 저장된다.

//클래스 선언, 객체 생성

public class Main {
  public static void main(String[] args){
    Custom custom01 = new Custom();
    //'new' -> new 연산자 뒤에 나오는 생성자를 이용해서 메모리에 객체를 만들라는 의미
    // 이때 만들어지는 객체를 'instance'라고 한다.
    // Custom 클래스를 참조하는 변수 'custom01' 선언, Custom 객체 1개가 생성된다.
  }
}

class Custom {
  //'Custom.java' 파일을 생성한다.
  // 해당 파일을 저장하면 디스크에 'Custom'이라는 클래스를 생성한다.
  // 'Custom' 클래스를 만들었다고 해도, 'Custom' 객체를 생성한 것은 아님
  // 클래스 == 객체의 설계도
}

② 객체(object)와 인스턴스(instance)의 정의

필드와 메소드에 대해 설명을 하기 전에, 객체와 인스턴스의 정의를 알고 갈 필요가 있다는 것을 알았고

자바 관련 서적들과 인터넷에 있는 자료들을 참고하고, 그 내용들을 정리해봤다.일단 객체라는 단어의 의미를 말하자면 다음과 같다.

 

"현실에 존재하거나 생각할 수 있는 것"

 

즉, 책상이나 의자와 같은 사물도 객체이고, 공부나 운동과 같은 개념으로 존재하는 것도 모두 객체이며더 나아가서 사람이 생각하고 표현할 수 있는 모든 것들도 객체로 볼 수 있다.결론을 내자면 객체라는 것은 추상적이고 철학적인 개념에 가까운 것이기 때문에개발 관점에서도 명확하게 무엇이다. 라고 결론을 내기는 어려운 것 같다.

그럼에도 나름대로 다음과 같이 정의를 내보았다.

 

(1). 객체(object)의 정의

- 소프트웨어 상에서 구현해야 할 대상, 개발 대상

- 객체를 만들기 위한 설계도가 '클래스(class)'이다.

- 클래스에서 선언한대로 그대로 만들어진 실체

 

(2). 인스턴스(instance)의 정의

- 클래스를 바탕으로 소프트웨어 상에서 구현된 구체적인 실체로

   객체를 소프트웨어에 실체화하면 그것을 '인스턴스(instance)'라고 한다.

- 추상적인 개념과 구체적인 객체 사이의 관계에 초점을 맞출 때 사용하며

   "~의 인스턴스"와 같은 형식으로 사용된다.

- 인스턴스는 객체에 포함된 개념으로, 객체는 '클래스의 인스턴스'라 할 수 있다.

- 하나의 클래스로 부터 여러 개의 인스턴스를 만들 수 있으며

   생성된 인스턴스는 독립된 메모리 공간에 자신만의 '필드(field)'를 가지고

   해당 클래스의 '메소드(method)'는, 해당 클래스로 부터 생성된 모든 인스턴스가 공유한다.

 

인스턴스를 정의내리자면 이런 식으로 정의할 수 있다.

다만 인스턴스라는 용어 자체는 클래스와 객체 사이의 관계로만 한정지을 필요가 없는 것이

시스템 관점에서는 실행 프로세스가 프로그램의 인스턴스로 볼 수 있기 때문에

인스턴스는 "어떠한 원본으로 부터 생성된 복제본"이라고 해도 될 것이다.


③ 필드(field)의 정의

- 클래스의 구성 요소 중 하나, 클래스에 포함된 변수를 의미한다.

- 게임 캐릭터로 치면, 해당 캐릭터의 이름, 체력과 같은 정보나 상태와 같은 것들을 속성이라고 하며

   자바에서는 이를 '필드(field)'라고 한다.

 

④ 메소드(method)의 정의

- 클래스의 구성 요소 중 하나로, 필드가 물체의 상태라면 메소드는 물체의 행동에 해당한다.

- 어떠한 특정 작업을 수행하기 위한 명령문의 집합

- 입력 값이 존재하고, 그 값을 받아서 특정한 동작을 수행하고 결과를 도출하는 수학의 함수와 비슷한 개념

   여기서 입력 값을 '매개 변수'라고 하며, 결과 값을 '반환 값'이라고 한다.

//필드, 메소드 상세 설명

public class Main {
    public static void main(String[] args) {
        MyCustom A = new MyCustom();
        //new 연산자에 의해 MyCustom 객체가 하나 만들어진다.
        //MyCustom 객체를 참조하는 참조 변수 'A'도 같이 만들어짐.
        //여기서 변수 A는 객체가 아니라 객체를 컨트롤 할 수 있는 리모콘이라고
        //보면 된다.
        //필드는 클래스에 포함된 변수로, 단독으로는 실행할 수 없다.
        //컴퓨터로 치면 'MyCustom'이라는 폴더에 저장된 텍스트 파일이라고 보면 된다.
        //텍스트 파일은 읽기와 수정이 가능하지만, 실행은 할 수 없다.
        //반대로 메소드는 실행 파일, 'exe'파일이라고 보면 된다.
        //읽기와 쓰기는 못하지만 실행은 할 수 있다.
        
        //MyCustom 객체의 속성, 필드를 수정한다.
        A.name = "Vincent";
        A.age = 25;
        A.isMarried = false;
        A.talk(); //MyCustom 객체 내부의 'talk()' 메소드 실행
    }
}

class MyCustom {
    //필드 (field)
    String name;
    int age;
    boolean isMarried;

    //메소드 (method)
    void talk(){
        System.out.println("=== 자기 소개 시작 ===");
        System.out.printf("이름 : %s\n", name);
        System.out.printf("나이 : %d\n", age);
        System.out.printf("결혼 여부: %b\n", isMarried);
        System.out.println("안녕하세요.");
        System.out.println("=== 자기 소개 종료 ===");
    }
    /* 메소드 구조
     * '접근 제어자''반환 타입''메소드 이름'(매개변수 목록) {구현부}
     * (1). 접근 제어자
     *  - 해당 메소드에 접근할 수 있는 범위를 명시
     * (2). 반환 타입(Return Type)
     *  - 메소드가 모든 작업을 마치고, 반환하는 데이터 타입을 명시
     * (3). 메소드 이름
     *  - 외부에서 해당 메소드를 호출하기 위한 이름
     * (4). 매개변수 목록(Parameters)
     *  - 메소드를 호출 시, 전달되는 인수의 값을 저장할 변수를 명시
     * (5). 구현부
     *  - 메소드의 고유 기능을 수행하는 명령문의 집합
     */
}

프로그램 실행 결과


2. 마치며

클래스와 객체에 대한 내용들을 정리하는 과정에서

개념적인 부분들을 제대로 짚고 넘어가야 한다고 생각해서

정보를 더 수집하고 이를 정리하다보니 처음에 계획했던 것보다 더 오래걸리고 분량도 늘어났다.

개인적으론 자바를 공부하면서 클래스와 객체에 대한 개념을 내가 만족하는 수준까지는 바로 잡고 넘어갈 필요가 있다고

스스로 판단을 내리고, 내용을 계속 수정하다 보니 시간 소요가 상당했던 것 같다.지금까지 설명한 내용들을 다시 정리하기 위해 예제로 활용하기 위한 소스 코드를 작성했지만이거는 Part2에서 다뤄보도록 하겠다.

 

 

 

 

 

 

'Programming > Java' 카테고리의 다른 글

[Java] 함수, 메소드  (0) 2022.11.30
[Java] 7. 클래스와 객체 (Part 2)  (0) 2022.11.21
[Java] 6. 배열 (Part 2)  (0) 2022.10.19
[Java] 6. 배열 (Part 1)  (0) 2022.10.19
[Java] 5. 반복문  (0) 2022.10.11