본문 바로가기

Java

클래스와 객체(미완성)

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

 

객체 지향 언어 vs. 절차 지향 언어


객체 지향 언어
객체 지향 프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나이다.
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나
여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.
각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
 
-위키백과-

자바는 '객체 지향 언어'입니다. 객체 지향 언어는 프로그램을 객체들 간 상호작용으로 구성해나가는 것을 의미합니다.

이런 객체지향적 언어의 장점은 프로그램 가독성(현실 세계와 같은 직관적 모델링)과 생산성(재사용성)에 있다고 합니다.

 

자바에서는 객체를 클래스라는 것으로 정의하고, 클래스를 통해 객체를 생성합니다.

자바에서 클래스 밖에는 아무것도 있을 수 없고, 의미도 없습니다 (Import문 등 제외)

또한 클래스를 정의한다는 것은, 새로운 데이터 타입을 정의한다는 것입니다.

 

절차 지향 언어
절차지향적 프로그래밍이라고도 불리는 프로그래밍 패러다임의 일종이다.
프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임을 의미한다.
프로시저는 간단히 말하여 수행되어야 할 연속적인 계산 과정을 포함하고 있다.
-위키백과-

절차 지향 언어는 단순하게 연속적인 계산 과정, 논리의 흐름에 따라 프로그램을 구성해나가는 것을 의미합니다.

대표적인 예시로 C와 같은 언어가 있습니다.

절차 지향적 언어는 복잡도가 높지 않아 여러 상황에서 객체지향적 언어보다 장점을 가진다고 합니다.


조합해서 정리해보겠습니다.

 

객체 지향은 프로그램의 연속적인 논리적 흐름이 없을까요?

당연히 그럴 리가 없습니다. 당연히 흐름을 갖고 있습니다.

하지만 절차 지향적 언어와의 가장 큰 차이점은, 클래스와 객체를 이용한다는 점인 것입니다.

 

물론 절차 지향적 언어도 어떻게 짜는지에 따라 높은 재사용성과 객체지향적 특성을 구현할 수 있습니다. 실제로 C언어를 잘 활용하는 고급 프로그래머들은 함수와 변수를 파일별로 잘 모듈화 하여 재사용성을 높인다고 합니다.

하지만 자바는 이를 기본 문법으로 설정하여 누구나 쉽게 객체지향적 특성에 잘 접근할 수 있도록 한 것입니다.

 

 

그러므로 자바를 잘 활용하려면 클래스와 객체에 대해서 잘 알아야 합니다.


 

 

클래스


그럼 어떤 것들을 클래스로 만들까요? 바로 우리가 프로그램 내에서 사용하고자 하는 그 어떤 것이든 가능합니다.

이런 클래스는 '필드'와 '메서드'로 이루어집니다.

필드는 객체의 속성을,

메서드는 객체의 행동을 의미합니다.

 

public class Person {

    //필드 (속성)
    private String name;
    private Integer age;
    
    //메서드 (행위)
    public void speak() {
        System.out.println("말합니다");
    }

    public void run() {
        System.out.println("달립니다");
    }
    
}

'사람'이라는 현실 세계의 객체를 자바 프로그램으로 가져와 '클래스'로 정의한 것입니다.

위와 같이 이름, 나이는 고유한 속성이기 때문에 필드로,

말을 하거나 달리는 등의 행위는 행위이기 때문에 메서드로 구성한 모습입니다.

 

    public static void main(String[] args) {
        Person person = new Person();
        person.run();
    }

그리고 위와 같이 클래스가 정의되어 있다면 새로운 '자료형'으로서 사용합니다.

 

위와 같이 정의된 클래스는 '클래스'이고, 실제로 클래스를 통해 생성된 변수들을 '객체'라고 합니다.

클래스는 '틀'일 뿐이고, 객체는 실제로 자신의 고유한 속성들을 갖고 있습니다.

(사람마다 이름과 나이는 다르듯)



 

클래스 구성


public class Person {

    //필드 (속성)
    private String name;
    private Integer age;
    
    //메서드 (행위)
    public void speak() {
        System.out.println("말합니다");
    }

    public void run() {
        System.out.println("달립니다");
    }
    
}

위에서 보았던 예시를 다시 보겠습니다.

 

이러한 객체는 자바에서 메모리에 어떻게 생성되는 것일까요?

지난번에 배열과 메모리(링크)에서 살짝 다룬 적이 있었습니다.

 

클래스를 new 연산자를 통해 생성하게 되면 '힙 메모리 영역'에 해당 객체만의 메모리 공간이 할당됩니다.

 

클래스 메모리

위와 같은 그림처럼 할당되는 것입니다. 클래스의 필드들을 위한 공간이 생기는 것은 알겠는데,

그러면 메서드를 위한 공간은 같이 할당되지 않는 것인가?

맞습니다. 메서드는 모든 클래스가 동일한 로직을 공유하기 때문에, 각 객체마다 생성되는 것이 아니라

프로세스 메모리의 '텍스트(코드) 영역(. class파일이 올라가는 곳)'에 할당됩니다.



객체 지향 언어의 특성


객체 지향 언어에는 4가지 특성이 있습니다.

  1. 추상화 (Abstraction) - 객체 지향 언어만의 특징은 아닙니다
  2. 캡슐화 (Encapsulation)
  3. 상속 (Inheritance)
  4. 다형성 (Polymorphism)

추상화를 통해 캡슐화를 이루고, 캡슐화를 통해 상속을 이루고, 상속을 통해 다형성을 이룰 수 있습니다.

다형성을 잘 이용하는 프로그래머가, 진짜 객체 지향적 설계를 잘하는 프로그래머라고 할 수 있겠습니다.

그래서 이 네 가지 개념에 대해서 알아보겠습니다.

 

추상화
추상화란, 프로그램으로 가져오고 싶은 객체의 속성과 행위를 추출해 내는 것을 의미합니다.
예를 들어 사람이라 하면
이름 나이 키 몸무게 등을 필드로 만들고, 말하기 생각하기 달리기 등을 메서드로 추출해내는 것을 의미합니다.
각 객체마다 속성이 조금씩 다르고, 행위도 조금씩 다를 수 있지만, 넓은 범위에서 공통된 특징과 행위로 '추상화' 시키는 것.
이것이 추상화의 개념입니다.

 

캡슐화
캡슐화란, 크게 2가지 의미를 갖습니다. 
첫 번째는 추상화를 통해 얻은 속성과 행위들을 클래스로 감싸는 것, (클래스로 생성)
두 번째는 해당 속성과 행위들 중 외부로 노출시킬 것과 그렇지 않은 것을 분류하는 것입니다. (접근자를 통해)

//추가 예정

'Java' 카테고리의 다른 글

Java의 패키지와 접근 지정자  (0) 2021.05.06
생성자  (0) 2021.04.13
예외 처리  (0) 2021.04.06
자바 배열과 메모리  (0) 2021.03.30
레퍼런스 변수와 메모리, 에러  (0) 2021.03.30