JAVA - 06. 객체지향 프로그래밍과 클래스
July 2, 2019
객체지향 프로그래밍(Object Oriented Programming )이란?
객체지향은 프로그램 설계방법론중 하나 이다. 프로그램을 수많은 '객체'라는 기본 단위로 나누고 이 객체들의 상호작용으로 서술하는 방식이다.
객체(Object) 란?
객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른것과 식별 가능한 것을 의미한다.
클래스(Class) 란?
클래스는 객체지향 프로그래밍의 가장 기본적인 요소이며, '속성(변수)과 기능(메소드)'의 묶음으로 나뉜다. 그리고 객체를 생성하기 위한 설계도라고 할 수 있다.
클래스와 객체가 햇갈리는 부분이 있을 수 있는데 클래스는 '설계도', 객체는 '설계도로 구현한 모든 대상'을 의미한다. 다음 예제를 보자.
클래스 정의하기
public class Student {
//맴버변수
int studentId;
String studentName;
//메소드
public void showStudentInfo(){
//학생 정보 출력
}
}
위 예제는 학생을 추상화 한 Student 클래스의 정의 이다. 클래스는 정의 할때 다음과 같은 규칙이 있다.
- 이름의 앞글자는 대문자를 사용(일반적인 관례)
- 클래스명은 파일명과 같아야 하고 public 키워드가 붙어야 한다. (한 java 파일 안에 여러 클래스를 정의하는 것은 가능하지만 파일명과 같은 클래스만 public 키워드를 붙일 수 있다)
위에도 언급하였지만, 클래스를 설계할 때 클래스는 속성과 기능의 묶음이고, 그 클래스로 부터 생성될 객체들은 서로 식별이 가능하도록 설계해야 한다. 그래서 맴버변수에 각 학생들이 식별될 수 있는 고유번호 studentNum을 만든 것을 알 수 있다.
위 Student 클래스는 정의만 하였고 사용되지 않았다. 이를 사용하는 예제를 보자.
클래스 사용하기
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentId = 1;
studentLee.studentName = "이형석";
studentLee.showStudentInfo();
Student studentKim = new Student();
studentKim.studentId = 2;
studentKim.studentName = "김종원";
studentKim.showStudentInfo();
}
}
Student 클래스는 new Student()
라는 선언을 통해 비로소 Student 객체
로 생성된 것이다.(객체의 생성을 '인스턴스화 되었다' 라고 불리기도 한다) 그리고 Student 객체를 사용하기 위해 Student 타입
의 studentLee 라는 참조 변수로 참조하고 있는 것을 볼 수 있다.(객체를 참조한다고 하였는데, 정확한 뜻은 객체의 주솟값을 참조하고 있는 것 이다)
이처럼 정의한 클래스를 객체로 생성할 때는 new
키워드를 통해 생성할 수 있다. 이때 '객체를 생성한다' 또는 '인스턴스화 한다'라고 한다.
그리고 위의 예제에서 전달하고자 하는 다른 부분은 똑같은 Student 클래스의 객체를 참조하는 studentLee와 studentKim은 서로 다른 객체라는 것 이다. 두 객체는 서로 다른 공간에 생성되어 다른 주소 값을 가지는 것을 알아두자.
인스턴스(Instance), 메모리 힙(Heap)
위 사진은 메모리의 구조를 나타낸다.
위 예제와 같이 새로운 객체를 생성하게 되면
new Student();
메모리의 힙이란 곳에 새로운 인스턴스가 만들어진다. (그래서 객체는 인스턴스라 불리기도 한다) 우리는 이것을 인스턴스화 한다라고 하고, 이 인스턴스는 자신의 주소 값을 가지고있다.
new Student(); // ex) 3fb6a447
그리고 참조 변수는 이 인스턴스(객체)의 주소 값을 참조받는 것 이다.
Student student = new Student(); // 3fb6a447 라는 주소 값을 참조한다.
조금 더 살을 붙이자면 이렇듯 new 로 생성된 인스턴스들은 각자 다른 공간에 만들어지고 주솟값도 다르기때문에, 같은 클래스로 만들어진 인스턴트들은 서로 다르다고 할 수 있다.
new Student();// 객체 1, 주소 값 ex) 3fb6a447
new Student();// 객체 2, 주소 값 ex) 79b4d0f
그리고 힙 영역은 프로그래머가 관리해야하는 영역이다. 생성된 객체가 사용되지 않으면 메모리에서 제거해주어야하는데, 자바는 가비지 컬랙터(Garbage Collector)가 필요한 타이밍에 알아서 관리해준다.
메모리 구조에 관한 내용은 원래 더욱 복잡한데, 다른 글에서 자세히 다루도록 하겠다.