자바는 객체지향형 프로그래밍 언어로 클래스, 추상 클래스, 인터페이스와 같은 객체지향적 문법 요소를 사용해 프로그램을 구성한다. 자바를 제대로 이해하려면 이러한 문법 요소를 이해해야 한다. 기본 문법 요소인 클래스에 관해 알아보자.
프로그램 문법 요소의 발전 과정
변수
→배열
→구조체
→클래스
- 변수
다양한 형태의 데이터를 저장하기 위해 각각의 데이터를 저장할 수 있는 변수라는 문법 요소를 만들어 사용- 배열
데이터의 종류가 많아질수록 데이터의 개수만큼 변수명을 짓거나 관리하는 일이 버거워졌다. 이런 문제를 해결하기 위해 만든 문법 요소가 '배열'이다. 배열을 사용하면 같은 자료형인 변수들을 묶어 1개의 새로운 자료형으로 관리할 수 있어 관리해야 할 변수의 개수를 줄일 수 있음- 구조체
배열은 같은 자료형끼리만 묶을 수 있으므로 반 학생들의 성적(int)과 반 평균(double)은 1개의 배열로 관리할 수 없다. 한 반의 성적 데이터를 한 번에 관리하면 훨씬 효율적일 것. 이를 보완하기 위해 만든 문법 요소가 '구조체'이다. 구조체를 사용하면 서로 다른 자료형도 1개의 자료형으로 묶어 관리할 수 있음.- 클래스
이렇게 다양한 자료형의 데이터를 하나로 묶어 관리할 수 있는 구조체는 말 그대로 데이터만 묶어 놓은 것. 여기에 반 평균 성적을 출력, 계산하는 등과 같은 기능을 추가하면 성적과 관련된 모든 내용을 효율적으로 처리할 수 있다. 이것이 바로 클래스이다. 즉, 클래스는 다양한 자료형의 데이터를 묶어 관리할 수 있을 뿐만 아니라 데이터를 처리하는 다양한 기능까지 함께 관리하는 문법 요소.
속성
또는필드
라고 한다.운전자
객체를 1개 더 추가, 전진하기
와정지하기
기능을 호출하기만 하면 끝.크게 클래스
와 인터페이스
가 있다.
클래스는 다시 일반클래스
와 추상클래스
로 나뉜다.
객체지향 문법 요소는 객체의 생성과 관련된 요소라 생각하면 된다. 다시 말해 클래스나 인터페이스를 활용해 객체를 직,간접적으로 만들고, 이를 활용해 프로그램을 실행.
A라는 이름의 클래스를 포함하는 자바 소스 파일 A.java의 구조
package ...; // 1. 패키지
import ...; // 2. 임포트
class 클래스명 {...} // 3. 외부 클래스
public class ... {
int a = 4; // 1. 필드(파일명과 동일)
double abc( ) {..} // 2. 메서드
A( ) {...} // 3. 생성
class 클래스명 {...} // 4. 이너 클래스
}
자바 소스 파일은 클래스의 외부 구성 요소와 내부 구성 요소로 나눠 생각 가능
void working() {...}
등이 포함 가능)(A(){...})
는 클래스의 객체를 생성하는 역할. 클래스 = 붕어빵 기계
객체 = 붕어빵
붕어빵을 먹고싶다고 해서 붕어빵 기계를 먹을 수는 없다.
붕어빵과 앙꼬를 먹고싶다면 붕어빵 기계에서 찍어 나온 붕어빵을 먹어야 한다.
클래스를 직접 사용할 수는 없지만, 클래스의 모든 특징(필드)과 기능(메소드)들을 사용하려면 클래스를 이용해 객체를 만든 후 그 객체 속의 필드와 메서드 등을 사용해야!
객체는 new 키워드로 생성 가능.
자바에선 대부분의 클래스가 이 방법으로 객체 생성
클래스에 따라 메소드를 사용해 객체를 생성할 때도 있지만 이때도 해당 메서드 내부에서 new를 사용해 객체를 생성한다.
클래스 명 참조 변수명 = new 생성자();
A a = new A();
객체 생성 코드를 구성하는 요소는 클래스명, 참조 변수이다.
참조변수는 실제 데이터를 저장하는 것이 아닌, 실제 데이터가 있는 힙 메모리의 위치값을 가르키는 변수
생성자는 클래스와 이름이 동일하지만, 뒤에 소괄호가 있음. 이 생성자가 실행되면 클래스의 객체 생성.
따라서 new는 생성자의 결과물로 나온 객체를 힙 메모리에 넣는다.
실제 데이터를 저장하고 있는 객체를 힙 메모리의 어느 위치에 넣었는지 알려 주지 않으면 그 객체를 ㅆ르 방법이 없다.
따라서 힙 메모리에 실제 객체를 넣을때 그 위치값을 참조변수에게 알려주는 것이다
위 객체 생성 예시에 포함된 코드를 다시 말로 표현하자면 A() 생성자로 만든 객체를 힙 메모리에 넣고 위치값을 A타입 참조 변수 a에 저장해! 라고 표현가능.
객체를 생성했을때 메모리에 어떻게 저장될까?
클래스 A는 메모리의 클래스 영역, 참조 변수는 스택 영역에 들어간다. 내부 공간에는 실제 데이터(객체)의 위칫값을 저장.
생성자로 만들어진 객체는 힙 메모리에 위치. 객체 내부에는 클래스의 멤버(필드, 메서드, 이너 클래스)가 위치. 객체에 포함된 3가지 요소가 사용할 수 있는 상태가 된 것임. 메서드를 살펴보면 실제 메서드 구현 코드는 클래스 영역 안에 저장해 놓고, 객체 안에서 메서드 영역의 위치만 가리키고 있다는 것을 알 수 있다. 그 이유는 1개의 클래스로 만든 모든 객체는 속성(필드)은 달라도 기능(메소드)은 동일하기 때문이다. 즉, 객체를 100개 만들어도 메서드는 단 한번만 만들면 된다.
자동차 클래스로 빨간색 자동차 객체와 파란색 자동차 객체를 만들면 힙 메모리에 각 객체가 저장된다.
빨간색 자동차의 color 속성값은 'red', 파란색 자동차의 color 속성값은 'blue'라고 가정해보자. 둘다 drive() 기능이 있어야 하므로 두 객체 안에 drive() 메서드가 포함되어 있어야 한다!
그런데 각 객체에 포함돼 있는 drive() 메서드 코드가 동일하므로 이를 메서드 영역에 1개만 만들어 두고 모든 객체가 공유!
=> 동일한 클래스로 만든 객체들은 기능(메서드)의 내용이 동일하므로 메서드 공유가능
클래스 A에는 필드 1개와 메서드 1객 ㅏ있다. 필드 값 m은 3으로 초기화, print() 메서드는 간단한 문자열 출력.
생성된 객체에서 필드값은 실제 저장 공간이 객체 내부에 있고, 메서드는 메서드 영역에 있는 1개의 메서드만 공유 하고 있음을 기억하자
객체 내부의 멤버를 사용한다는 의미. 필드를 사용한다는 것은 필드에 값을 넣거나 읽어온다는 것, 메서드를 사용한다는 것은 해당 메서드를 호출하는 것을 말한다.
자바에서는 힙 메모리에 직접 접근할 수 있는 방법이 없으며, 위치 정보를 포함하고 있는 참조 변수를 이용해 객체 접근 가능. 이때 사용하는 것이 포인트 연산자(.)이다. '해당 위치에 있는 객체 안을 보라!'
필드와 메서드의 활용)
참조 변수명. 필드명()
참보 변수명. 메소드명()
A a = new A( );
System.out.println(a.m;) //필드 활용
a.print( ); //메서드 활용
클래스 구성과 객체의 생성 및 활용
package chap6;
class A { // 클래스(붕어빵 기계) 정의
int m = 3;
void print() {
System.out.println("객체 생성 및 활용");
}
}
public class CreateObjectAndUsageOfMembers {
public static void main(String[] args)
{
// 클래스로 객체(붕어빵) 생성
A a = new A();
// 클래스 멤버 활용(붕어빵 잘 먹기)
//@필드 활용: 필드에 값을 읽기/쓰기
a.m = 5;
System.out.println(a.m);
// @메서드 활용: 메서드를 호출
a.print();
}
}
📕 참고문헌) Do it! 자바 완전 정복!