객체와 객체 지향 프로그래밍

자바를 공부하는 사람이라면 자바가 객체지향이라는 말을 많이 들어봤을 것이다. 그렇다면 과연 객체는 무엇이고, 객체 지향은 무엇인지 살펴보자.

  • 객체란?

  • 객체 지향
    • 객체 지향의 특징
  • 객체와 클래스

객체란?

객체는 말그대로 어떤 특정 객체를 나타낸다.

객체는 동작( 어떤 동작이든 상관 없다 ) 을 하는 모든 물체라고 이해하면 된다.

세상의 모든 것은 모든 물체는 객체가 될 수 있다. 우리가 사는 세상은 모두 객체로 이루어져 있다. 그렇기 때문에 객체 지향 프로그래밍이 현실 세계를 가장 잘 반영한 프로그래밍 방법이라는 말이 있다.

예를 들어

  • 핸드폰 : 전화를 건다, 전화를 받는다, 번호를 누른다 등등의 동작을 하는 객체이다.
  • 마우스 : 오른쪽 클릭을 한다, 왼쪽 클릭을 한다, 드래그를 한다 등등의 동작을 하는 객체이다.
  • 가방 : 물건을 넣는다, 지퍼를 잠근다 등등의 동작을 하는 객체이다.

자바에서 그런 객체는 클래스로 표현되고 객체들이 하는 동작은 클래스의 내부 메소드로 표현된다.

위키백과에서 객체지향 프로그래밍에서 객체를 아래와 같이 표현했다.

객체지향 프로그래밍에서 객체는 클래스인스턴스이다. 클래스 객체는 자료와 그 자료를 다루는 명령의 조합을 포함하여 객체가 메시지를 받고 자료를 처리하며 메시지를 다른 객체로 보낼 수 있도록 한다.

실세계의 유추로 설명하자면, 만약 어떤 사람이 집에서 살기를 원할 때, 그 집의 청사진(집의 사진)이나 축소 모형 따위는 전혀 필요가 없다. 필요한 것은 설계에 맞는 실제 집이다. 이 유추에서 청사진은 클래스를 나타내고 실제 집은 객체를 나타낸다.



객체 지향

객체 지향은 OOP(Oriented Object Programming) 라고 불리며, 연관 있는 변수와 기능의 묶음이란 뜻으로 사용된다.

세상에는 많은 객체 지향 언어들이 있다.

그 중, 자바는 지금까지 널리 사용되고 있는 대표적인 객체 지향 프로그래밍 언어이다.

과연 객체 지향는 무엇일까?


객체 지향 VS 절차 지향

  1. 절차 지향 :
    1. 프로그램을 실행하는 동안 실행되어야할 계산들이 연속적인 순서를 바탕으로 실행된다.
    2. 특정 기능을 하는 프로시져( 지금은 함수라고 생각해도 된다. )는 자기 자신 뿐만 아니라 프로그래밍 어디에서나 다시 불러 실행시킬 수 있다.
    3. 복잡도가 낮고 유지보수하기 쉽다.
  2. 객체 지향
    1. 프로그램의 실행의 단위를 단순이 데이터의 처리 방법으로 나누는 것이 아니라, 특정 객체들을 만들어서 이들의 상호 연결을 통해 프로그래밍을 구현한다.
    2. 객체 지향 프로그래밍은 우리의 현실과 가장 밀접한 관련이 있는 프로그래밍 방법이다.
    3. 객체는 기능을 하는 물체라고 생각하면 된다.
      1. 자동차: 달린다, 멈춘다, 핸들을 꺾는다 등의 기능을 하는 객체
      2. 사람: 먹는다, 달린다, 잔다, 등의 기능을 하는 객체

객체 지향 프로그래밍의 특징

자바에서 객체는 클래스를 통해 표현된다.

객체 설명

  • 상속성: 상위 클래스와 하위 클래스의 상관 관계.
    • 동물 객체와 식물 객체( 자식 객체 )는 생물 객체( 부모 객체 )의 하위 객체이다.
  • 은닉성: 하나의 클래스에 다른 곳에서의 접근을 차단하여 은닉한다. (보안)
    • 형식 지정자
      • public
      • private
      • protected
  • 다형성: 자식 클래스의 여러가지 형태를 객채화 한다.
    • 생물은 동물이다. 라는 말은 성립하지 않는다. 하지만 동물은 생물이다 라는 말은 성립한다.
    • 상위 객체는 하위 객체를 담을 수 있다.

객체와 클래스

Student.java

public class Student {
  //클래스 내부에는 변수와 함수가 올 수 있다.
  //클래스 내부의 변수를 멤버 변수라고 부른다.
  int age;
  String name;
  int ban;

  //클래스 내부의 함수를 멤버 함수라고 부른다.
  void doStudy(){
    System.out.println("공부를 시작합니다!!");
  }
  void endStudy(){
    System.out.println("공부를 끝냅니다!!");
  }
  void goHome(){
    System.out.println("집에 가겠습니다!");
  }
  void goSchool(){
    System.out.println("학교에 가겠습니다!");
  }
}

객체는 연관된 동작을 하는 하나의 묶음이라고 생각할 수 있는데, 학생이라는 객체를 생성한다면 크게

  • ban
  • 이름 name
  • 나이 age
  • 공부를 하는 동작 doStudy()
  • 공부를 끝내는 동작 endStudy()
  • 집에 가는 동작 goHome()
  • 학교에 가는 동작 goSchool()

으로 나눌 수 있다. 원하는 기능은 추후에 메소드 형태로 추가만 하면 된다.

Main.java

public class Main {
  public static void main(String[] args) {
    Student chulsu;	//Student 객체를 담을 인스턴스, 객체
    chulsu = new Student();	//객체를 생성한다.

    //객체 내부는 .을 통해 접근할 수 있다
    chulsu.name = "철수";//chulsu 객체에 이름 등록
    chulsu.age = 15;	//chulsu 객체에 나이 등록
    chulsu.ban = 3;		//chulsu 객체에 학급 등록

    System.out.println("이름은 "+chulsu.name+"입니다.");
    System.out.println("나이는 "+chulsu.age+"살 입니다.");
    System.out.println("학급은 "+chulsu.ban+"반 입니다.");

    //철수를 학교에 보낸다.
    chulsu.goSchool();

    //철수에게 공부를 시킨다.
    chulsu.doStudy();

    //철수에게 공부를 그만 시킨다.
    chulsu.endStudy();

    //철수를 집에 보낸다.
    chulsu.goHome();

  }
}
이름은 철수입니다.
나이는 15살 입니다.
학급은 3반 입니다.
학교에 가겠습니다!
공부를 시작합니다!!
공부를 끝냅니다!!
집에 가겠습니다!

철수라는 학생은 chulsu라는 객체로 생성되었다. 만약 영희라는 학생을 객체로 만들고 싶다면, 철수와 같은 방법으로 Student younghee = new Student(); 객체를 생성해주고 이름, 나이, 반을 설정해주면 된다.

철수와 영희는 모두 학생 ( Student 객체 소속) 이다.


※클래스 파일은 같은 패키지 안에 있어야 한다. 만약 다른 패키지에 속해 있다면 꼭 import 를 해줘야 한다.

Comments