3 분 소요

Java의 핵심 개념인 객체지향에 대해 공부하겠습니다.

1. 객체지향 프로그래밍의 이해

Java는 객체지향 언어입니다. 우선 객체에 대해 공부하겠습니다.

객체(Object)의 사전적 의미는 의사나 행위가 미치는 대상, 즉 물건 또는 대상을 의미합니다.
프로그래밍적으로는 구체적, 추상적 데이터의 단위입니다.
예를 들면 사람, 자동차, 주문, 생산, 관리 등이 있습니다.

객체 지향 프로그램(Object Oriented Porgramming, OOP)은 위에서 설명한 객체를 기반으로 하는 프로그래밍을 의미합니다.
객체를 정의하고, 객체의 기능을 구현하며, 객체간의 협력을 구현합니다.
쉽게 표현하자면 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 프로그램입니다.

객체 지향 프로그램과 다른 프로그램도 존재합니다.
바로 절차 지향 프로그램입니다. 절차 지향 프로그램은 시간이나 사건의 흐름에 따라 구현합니다.
예시로 둘의 차이를 보겠습니다.

  1. 절차 지향: 일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다 -> 요금을 지불한다 -> 학교에 도착
  2. 객체 지향: 각 학생, 밥, 버스, 학교의 객체가 존재하고 객체간에 먹는다, 탄다, 간다 등의 기능이 존재

2. 클래스(class)

객체를 생성하기 전 객체의 생성을 위한 틀이 있어야 합니다.
해당 틀을 클래스(class)라고 합니다.

클래스는

  1. 객체를 코드로 구현한 것이며
  2. 객체 지향 프로그래밍의 가장 기본요소이고
  3. 객체의 청사진(blueprint) 라고도 합니다.

클래스는 멤버 변수와 메서드로 이루어집니다.
멤버 변수는 객체가 가지고 있는 속성을 변수로 표현한 것입니다.
메서드는 객체의 기능을 구현한 함수입니다.
둘의 사용 방법은 뒤에서 자세하게 다루겠습니다.

3. 클래스 정의, 사용법

클래스를 정의하는 방법을 예시로 먼저 들어보겠습니다.

public class Student{
    int studentNum;
    String name;
    String address;

    public void showStudentInfo(){
        System.out.println("학번은 " + studentNum + ", 이름은 " + name + ", 주소는 " + address + " 입니다.");
    }
}

위 코드에서 studentNum, name, address는 학생의 속성을 나타내는 멤버변수이고,
showStudentInfo는 학생의 정보를 나타내는 메서드입니다.

클래스를 사용하는 방법은 크게 두개의 순서로 진행됩니다.

  1. 클래스 생성하기
  2. 클래스의 속성, 메서드 참조하기

클래스를 생성하는 방법은 new 키워드를 사용해 생성자로 생성하는 것입니다.(생성자는 나중에 다루겠습니다.)

Student studentLee = new Student();

여기서 앞에 사용된 studnetLee는 객체의 속성과 메서드를 사용하기 위한 참조변수입니다.
뒤에 new Student()는 객체를 생성하는 단계입니다.
new 키워드는 객체를 생성한다는 키워드이고 Student()가 생성자입니다.
이렇게 하면 Studnet 클래스가 메모리에 생성이 됩니다.
(클래스를 정의한다고 해서 메모리에 클래스가 생성되는 것은 아닙니다.)

클래스의 속성, 메서드를 사용하는 방법은,

studentLee.studentName = "Lee"
studentLee.showStudentInfo();

입니다.(자세한 방법과 이유는 뒤에서 설명하겠습니다.)

  • public 클래스: Java 파일 하나에 여러개의 클래스가 존재 할 수 있습니다. 단, public 클래스는 하나이고, 자바 파일명과 동일해야합니다.

4. 함수

함수와 메서드에 대해 알아보겠습니다.

함수(function)란

  1. 하나의 기능을 수행하는 일련의 코드
  2. 함수는 호출하여 사용하고 기능이 수행된 후 값을 반환 할 수 있다
  3. 함수로 구현된 기능은 여러 곳에서 호출되어 사용할 수 있다
  4. 입력값은 여러개가 될 수 있지만 반환 값은 단 한개이다

함수를 정의하는 방법과 사용하는 방법을 예시로 먼저 보겠습니다.

int add(int num1, int num2){
    int result;
    result = num1 + num2;
    return result;
}

위의 코드가 함수를 정의하는 방법입니다.
구성 요소는,

  1. 함수의 이름 (add)
  2. 매개변수 (num1, num2)
  3. 반환 타입(int => 함수 이름 앞)
  4. 반환 값(return result)
  5. 함수 몸체

로 구성됩니다.
return은 반환하는 값을 나타내는 동시에 함수의 종료 시점을 말해줍니다.

사용 방법은 실행 코드에서 호출하여 사용합니다.

int num1 = 1;
int num2 = 2;

System.out.println(num1 " + " num2 " = " + add(num1, num2));

실행 결과는 1 + 2 = 3 입니다.
위의 코드에서 add 함수 소괄호 안에 있는 값들을 인자라고 합니다.

5. 스택 메모리와 메서드

함수가 호출될 때 사용하는 메모리가 있는데, 스택(stack) 메모리라고 합니다.

스택: 함수가 호출될 때 사용하는 메모리, 함수가 호출 된 후 수행이 끝나면 자동으로 반환


public class FunctionTest{
    public static int addNum(int num1, int num2){
        int result;
        result = num1 + num2;
        return result;
    }

    public static void main(String[] args){
        int n1 = 10;
        int n2 = 20;
        int total = addNum(n1, n2);

        System.out.println(total);
    }
}

해당 코드에서 함수 호출과 스택 메모리 구조를 확인하겠습니다.

  1. main() 함수가 사용할 메모리 공간이 스택에 생성됩니다. (n1, n2, total)
  2. main()에서 addNum()을 호출합니다.
  3. addNum() 함수가 사용할 메모리 공간이 스택에 생성됩니다.
  4. main()에서 addNum()의 사용이 끝나면 addNum() 함수가 사용한 메모리 공간이 사라집니다.
  5. add() 수행 후 메모리를 해제하고 main()으로 돌아옵니다.

해당 순서로 함수가 호출되고 메모리가 해제됩니다.

메서드(method)에 대해 알아보겠습니다.
메서드는 객체의 기능을 구현하기 위해 클래스 내부에 구현된 함수를 말합니다.
메서드를 구현함으로써 객체의 기능이 구현이 됩니다.
메서드의 이름은 사용하는 쪽(클라이어트 코드)에 맞게 명명하는게 좋습니다.
ex) getStudentName()

6. 인스턴스, 힙메모리

인스턴스(instance)란 클래스로 부터 생성된 객체입니다. 위에서 클래스를 생성하는 방법을 공부했는데,
정확히는 인스턴스를 생성하는 것입니다.(인스턴스화)

Student studentLee = new Student();

클래스를 기반으로 new 키워드를 이용해 여러개의 인스턴스를 생성하며,
힙 메모리에 멤버 변수들의 크기에 따라 메모리가 생성됩니다.

  • 인스턴스들은 힙 메모리라는 공간에 별개의 메모리를 지닙니다. 힙 메모리에 있는 것들은 나중에 사용하지 않게 되면 G.C라는 쓰레드가 자동으로 수거합니다.

다음은 참조변수와 참조 값에 대해 설명하겠습니다.
위에서 봤듯이

Student studentLee = new Student();
studentLee.studentName = "Lee"
studentLee.showStudentInfo();

이런식으로 참조하게 됩니다.
studentLee는 객체(인스턴스)에 접근하기 위한 참조변수 입니다.
참조변수를 통해 객체에 있는 멤버변수와 메서드를 사용할 수 있습니다.

그렇다면 참조변수는 정확히 어떤 것이 저장될까요?
인스턴스에 대해 설명할 때 인스턴스는 생성 시 힙메모리에 따로 생성된다고 배웠습니다.
해당 인스턴스의 메모리 주소값(참조 값)이 이 참조변수에 저장 되어있고, .연산자를 사용해 객체의 멤버변수 메서드에 접근하는 것입니다.

태그:

카테고리:

업데이트:

댓글남기기