[Java] 객체 지향 프로그래밍과 클래스

5 분 소요

클래스란?

클래스는 객체와의 속성과 기능을 코드로 구현한 것으로, 객체를 클래스로 구현하는 것을
‘클래스를 정의한다’라고 한다. 클래스를 정의하려면 우선 클래스 이름과 클래스가 가지는 속성,
또는 특성이 필요하다. 객체를 코드로 구현한다는 말이 모호할 수 있으니
‘학생’이라는 객체를 클래스로 살펴보자.

학생이라는 객체가 있다면, 이 객체가 가지는 일반적인 속성들이 있을것이다.
예를들어 학번, 이름, 학년, 사는곳 정도가 될 수 있는데, 이런 클래스 속성은 특성이라고도 하고
클래스 내부에 변수로 선언한다.

이렇게 선언하는 클래스의 속성을 ‘멤버 변수’라고한다.

클래스를 정의하는 문법을 간단히 나타내면 다음과 같다.

1
2
3
4
(접근 제어자) class 클래스 이름 {
    멤버 변수;
    메서드;
}

그럼 예를들어 학생이라는 객체의 클래스를 선언해보자.

1
2
3
4
5
6
7
8
9
package classpart;

public class Student {
    int studentID;
    String studentName;
    int grade;
    String address;
    
}

위의 코드를 보면, 우리는 Student라는 클래스를 선언했다.
또, 위에서 말한 객체의 속성을 변수로써 클래스 안쪽에 선언했는데,
자바프로그램은 모든 요소가 반드시 클래스 내부에 존재하여야 한다.
클래스 외부에는 package 선언과 import 외에는 아무것도 선언하지 않는다.

클래스 기능을 구현하는 메서드

지금까지는 클래스의 속성인 멤버 변수를 선언했다면, 이번에는 클래스에 관련된 기능을 구현해볼 것이다. 예를 들어 앞서만든 학생의 클래스라면 이를 출력하는 메서드 showStudent를 만들어 보자

1
2
3
4
5
6
7
8
9
10
11
12
package classpart;

public class Student {
    int studentID;
    String studentName;
    int grade;
    String address;

    public void showStudent(){
        System.out.println(studentName+","+address);
    }
}

위처럼 클래스 내부에 학생의 이름과 주소를 출력하는 메서드를 만든 것을 알 수 있다.
아직은 기능으로만 존재하기 때문에 이 메서드를 사용하려면 다른 방법이 추가되어야 한다.
그럼 그 전에 먼저 패키지에 대해서 알아 본 후 기능을 실제로 사용해보도록하다.

패키지란?

패키지는 간단히 말하면 클래스 파일의 묶음이라고 할 수 있다.
패키지를 말들게 되면 프로젝트 하위에 디렉토리가 하나 생기게 되는데, 이렇게 만든 패키지는
계층 구조를 가질 수 있다. 만약 학교와 관련된 프로젝트 파일이 있다면 강좌에 관련된 클래스, 학생에 관련된 패키지 등등 서로 관련이있는 클래스를 묶어주는 패키지 파일을 만들어줌으로써 계층구조를 갖도록 해주어 소스코드 관리와 유지보수를 편하게 해줄 수 있다.

패키지 선언은 맨위에 해줌으로써 이 클래스가 어떤 패키지에 소속되어있는지 알려준다.
클래스 이름이 같다고 해도 패키지 이름이 다르면 클래스 전체의 이름이 다른것이므로 다른 클래스가 된다. 다시 말해서 같은 이름의 클래스라도 다른 패키지에 속해있다면 그 두 클래스는 연관이 없다.

함수란?

함수는 하나의 기능을 수행하는 코드를 미리 만들어 놓은것으로,
예를들어 더하기 함수가 있다면 우리는 덧셈을 할때마다 덧셈에 대한 코드를 일일히 입력할 필요가
없이 더하기 함수를 불러옴으로써 간단하게 덧셈 연산을 수행할 수 있을 것이다.

함수 정의하기

더하기 함수를 실제 코드로 작성해보자.
함수의 반환형, 함수이름과 매개변수를 선언해주면, 우리는 함수를 선언할 수 있다.

1
2
3
4
5
int add(int num1, int num2){
    int result;
    result = num1+num2;
    return result
}

함수 호출하고 값 반환하기

아까 위에서 학생의 이름을 출력하는 함수를 구현만 하고 사용해보지 않았는데, 이번에는
어떻게 함수를 사용하는지에 대해 알아보도록 하자.
위에서 정의했던 add함수를 한번 구현하고 호출해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package classpart;

public class FunctionTest {
    public static void main(String[] args){
        int num1 = 10;
        int num2 = 20;

        int sum = add(num1, num2);
        System.out.println(sum);

    }

    public static int add(int n1, int n2){

        int result = n1 + n2;
        return result;
    }
}

클래스 기능을 구현하는 메서드

자바는 함수와 별개로 클래스 내부에서 사용하는 멤버 함수를 따로 지원하는데,
이를 메서드라고 한다. 메서드는 멤버변수를 사용하여 클래스의 기능을 구현하는 것으로
함수에 객체지향이 포함된 용어로 이해하면 쉽다.

아까 만들었던 Student 클래스에 학생의 이름을 가져오는 메서드를 한번 만들어보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package classpart;

public class Student {
    int studentID;
    String studentName;
    int grade;
    String address;

    public void showStudent(){
        System.out.println(studentName+","+address);
    }
    public String getStudent(){
        return studentName;
}
}

아까 만들었던 클래스에 이처럼 getStudent() 메서드를 추가해보았다.
그럼 이번에는 학생이름을 멤버 변수에 대입해주는
setStudentName()메서드를 동일하게 구현해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package classpart;

public class Student {
    int studentID;
    String studentName;
    int grade;
    String address;

    public void showStudent(){
        System.out.println(studentName+","+address);
    }
    public String getStudent(){
        return studentName;
}
    public void setStudentName(String name){
        studentName = name;
}
}

그럼 이제 이 메서드를 어떻게 사용하는지에 대해 알아보자

클래스와 인스턴스

클래스를 사용하여 프로그램을 실행하려면, 먼저 main() 함수를 알아야 한다.
main() 함수는 자바의 가상머신이 프로그램을 시작하기 위해 호출하는 함수로,
클래스 내부에 만들지만, 클래스의 메서드는 아니다.

main() 함수에서 클래스를 사용하는 방법은 두가지가 있는데,

  • 직접 만든 클래스 내부에 main()을 만드는 방법
  • 외부에 테스트용 클래스를 만들어 사용하는 방법
    두가지가 있다.

먼저 첫번째 방법으로 방금 만든 Student 클래스에 main() 함수를 작성해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package classpart;

public class Student {
    int studentID;
    String studentName;
    int grade;
    String address;

    public void showStudent(){
        System.out.println(studentName+","+address);
    }
    public String getStudent(){
        return studentName;
    }
    public void setStudentName(String name){
        studentName = name;
    }

    public static void main(String[] args){
        Student studentLee = new Student();
        studentLee.studentName = "이민재";

        System.out.println(studentLee.studentName);
        System.out.println(studentLee.getStudent());
    }
    
} 
1
2
>>> 이민재
>>> 이민재

이렇게 클래스안에 main() 함수를 선언하여 클래스를 테스트 해보았다.
하지만 이런 방식이라면 거의 모든 클래스에 main() 함수가 존재해야 한다.

따라서 위에서 설명한 두번째 방법인, 테스트용 클래스를 만들어 메서드를 실행시켜보도록 하겠다.

1
2
3
4
5
6
7
8
9
10
11
package classpart;

public class StudentTest {
    public static void main(String[] args){
        Student studentLee = new Student();
        studentLee.studentName = "이민재";

        System.out.println(studentLee.studentName);
        System.out.println(studentLee.getStudent());
    }
}
1
2
>>> 이민재
>>> 이민재

실행결과가 동일한 것을 알 수 있다.

new 예약어로 클래스 생성하기

클래스를 만들고 실행하는 과정을 살펴보자.
클래스를 사용하려면 먼저 클래스를 생성해야 하는데, 자바에서 클래스를 생성할때는
new 예약어를 사용하고 이어서 생성자를 써준다.

1
클래스형 변수 이름 = new 생성자

클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하려 대입하면 새로운 클래스가 생성된다.
클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간에 올린다는 뜻으로,
이렇게 실제로 사용할 수 있도록 생성된 클래스를 ‘인스턴스’라고 한다.

우리가 앞에서 사용했던 코드를 다시 한번 보면,

1
Student studentLee = new Student();

위 코드는 Student 클래스 자료형으로 StudentLee 변수를 선언하고
new Strudent(); 로 Student 클래스를 생성하여 studentLee에 대입한다는 뜻이다.
이때 studentLee를 참조변수라고 하고, 이 변수가 생성된 인스턴스를 가르키게된다.

이렇게 인스턴스를 생성하게 되면 이 인스턴스의 멤버 변수와 메서드를 참조하여 사용 할 수 있게된다.
예를들어 우리가 만든 studentLee를 이용하여 멤버변수와 메서드를 사용해보면,

1
2
studentLee.studentName ="이민재"
System.out.println(studentLee.getStudentName)

인스턴스와 힙 메모리

인스턴스가 생성되는 과정을 조금 더 자세히 살펴보자.
new Student()를 선언하면 Student가 하나 생성되는데, 각 Student는
studentID, studentName 등의 멤버 변수를 갖고있다. 그런데 이 변수들을 저장할 공간이 있어야 한다. 이때 사용되는 메모리를 힙 메모리라고 하는데 클래스 생성자를 하나 호출하면, 인스턴스가
힙메모리에 생성되게 되는 것이다.

1
Student studentLee = new Student();

위와 같이 생성된 클래스 (new Student())를 studentLee 변수에 대입하면,
인스턴스가 저장된 메모리를 studentLee 변수가 가르키게 된다.
studentLee는 지역변수이므로 스택 메모리에 생성되게 되고, 인스턴스는 힙메모리에 생성된다.

따라서 지역변수 studentLee에 생성된 인스턴스를 대입하는 것은 studentLee에 인스턴스가
생성된 힙 메모리의 주소를 대입한다는것과 같은 의미이다.

정리

객체 지향을 배우다 보니 새로운 용어가 많아 혼란스러울 수 있는 내용들을 정리해 표로
정리해보았다. 개념들이 이름도 살짝 모호하고 서로 엮여있다보니 헷갈릴 수가 있어
확실하게 어떤 것을 가르키는 개념인지 잘 기억해 두어야겠다.

용어 설명
객체 객체 지향 프로그램의 대상, 생성된 인스턴스
클래스 객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스 클래스가 메모리에 생성된 상태
멤버 변수 클래스이 속성, 특성
메서드 멤버 변수를 이용하여 클래스의 기능을 구현
참조 변수 메모리에 생성된 인스턴스를 가리키는 변수
참조 값 생성된 인스턴스의 메모리 주소 값

카테고리:

업데이트:

댓글남기기