클래스와 객체
종종 프로그래밍언어 특징을 말할때 "요놈은 객체지향 프로그래밍 언어로....~~" 라고 하는 것을 종종 볼 수 있다.
일단 객체가 뭔가?
객체는 구분할 수 있는 모든 것들을 말한다.
TV, 카메라, 라디오, 고려은단 깡통, 순이네 국밥 간판...
이 모든것이 객체인 것이다.
심지어 우리 머릿속에 있는 개념이나 생각 까지도 객체인 것이다.
프로그래밍 언어는 크게 객체지향과 절차지향 언어가 있는데, 우리는 객체지향 언어인 JAVA를 공부하니, 객체지향만 설명 하겠다.
우리가 사용하는 JAVA에서 객체라면 변수, 메서드 등등등... 데이터들이 객체가 된다.
이 객체들을 얼기설기 엮어서 프로그램을 만드는 것이다.
여기서 클래스는 객체를 만드는 것이고, 클래스로 만들어진 것은 객체인것이다.
1. 클래스
클래스는 객체를 정의한 설계도, 틀이라고 말하면 쉽다.
클래스를 통해 객체를 생성하는 것이다.
쉽게 예를 들어 설명하겠다.
우리가 집을 지을때 아기돼지 삼형제처럼 대충 짓지 않는다 먼저 설계도부터 그리고 시작한다.
설계도에는 어디에 방이 있는지, 주방은 어딘지, 주방에 후드는 달아놓는지 등을 기록해 놓는다.
그리고 후에 집을 짓는다.
이렇게 "설계도" 를 바탕으로 "집"이 완성 되었다!
여기서 설계도는 "클래스"로 보면 되고, 집 안의 거실 주방, 가구 등은 "변수", 내부 공조시스템이나 난방시스템은 이 집의 기능으로 "메서드" 라고 보면 된다.
여기서, 클래스(설계도)로 생성된 객체(물건, 기능 등) 을 인스턴스라고 부른다.
클래스로 객체를 만드는 행위도 인스턴스화 라고 한다.
JAVA를 쓸 때 우리는 클래스를 이용해서 인스턴스를 찍어내서 프로그램을 작성한다.
클래스 구성요소, 문법
class 클래스명 {
변수;
기능을 담은 메서드;
}
클래스를 선언할 때는 클래스명과 그 안에서 사용하는 변수, 그리고 메서드로 구성된다.
클래스는 네 가지 구성요소가 있는데,
public class ExampleClass {
int x = 10; // (1)필드
void printX() {...} // (2)메서드
ExampleClass {...} // (3)생성자
class ExampleClass2 {...} // (4)이너 클래스
}
필드, 메서드, 생성자, 이너클래스로 구성되어 있다.
- 필드 : 클래스의 속성을 나타내는 변수. / 집으로 예를 들면 창문, 방문, 가구 등이 해당된다.
- 메서드 : 클래스의 기능을 나타내는 함수이다. / 집으로 치면 보일러시스템, 공조시스템 등등...
- 생성자 : 클래스의 객체를 생성하는 역할을 한다./ 생성자를 사용하면 클래스 내의 것들이 찍어내진다. (인스턴스화)
- 이너 클래스 : 클래스 안에 또 클래스가 있는 것.
2. 객체
JAVA에서 객체는 속성과 기능 이라는 두가지 요소로 이루어져 있다.
속성과 기능은 필드와 메서드로 정의 되는데, 이것들을 묶어서 (이너클래스 포함) 객체의 맴버 라고 부른다.
속성 = 필드 는 쉽게 말해서 변수를 의미하고
기능 = 메서드 는 함수(코드로 특정 동작을 하게 하는 것)이라고 보면 된다.
아까 앞에서 클래스 안에 다 들어 있다고 했는데, 이걸 어떻게 생성하느냐?
class Food {
public static void main(String[] args) {
Food chicken = new Food(); // Food 클래스를 기반으로 생성된 chicken 인스턴스
Food pizza = new Food(); // Food 클래스를 기반으로 생성된 pizza 인스턴스
Food bread = new Food(); // Food 클래스를 기반으로 생성된 bread 인스턴스
}
위의 코드처럼 기존의 클래스를 불러와서 새로운 이름을 붙여서 인스턴스를 만들 수 있다.
객체의 생성과 활용
객체는 클래스가 "찍어낸" 것이라 했다.
객체를 어떻게 찍어내느냐?
클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장
->객체 생성의 예시
선언과 객체 주소를 참조변수에 바로 저장 하는 방법도 있다.
클래스명 참조_변수명 = new 생성자();
우리가 생성자로 클래스의 객체를 생성하는 것은 "해당 객체를 힙 메모리에 넣고, 그 주소값을 참조변수에 저장하는 것과 같다."고 한다.
이게 무슨말이냐?
클래스를 저장하는 공간하고, 클래스로 찍어낸 객체의 공간이 다르다는거다.
스택 메모리 (스텍 영역)
정적 메모리 라고도 한다. 컴파일 할때 해당 메모리의 공간을 지정하기 때문에 도중에 늘리거나 줄일 수 없다.
스택 영역에 있는 데이터는 함수가 반환되는 순간 해당 데이터는 사라진다.
힙 메모리
프로그래머(콤퓨타)가 원할 때 얼마든지 가져와서 쓸 수 있다.
컴파일할때 메모리 크기가 할당되는게 아니고, 실행 중에 크기가 할당 된다.
실행 중에 필요하면 계속 영역을 차지하면 되니까 용량의 제한이 없다.
그런데 잘못쓰면 영역을 저그가 해처리 늘리는 것 처럼 계속 늘어나서 메모리 누수가 될 수 있다.
함수를 반환해도 데이터가 살아있다.
클래스 영역
우리가 만든 클래스가 들어있는 영역, 우리가 만든 함수 자체가 들어있으므로 값이 계속 유지되고 있는다.
위에서 보이는 객체의 이름 (참조변수 p) 에는 객체의 전체 정보가 들어있는 것이 아니다.
힙 영역의 클래스 맴버(필드, 메서드, 이너 클래스)가 어디 있는지 알려주는 주소를 저장하고 있다.
잘 보면 힙 메모리 영역의 메서드는 클래스 영역의 메서드와 연결 되어 있는데, 객체를 생성할 때마다 메서드를 새로 저장하지 않고, 클래스의 메서드을 불러와서 사용한다. (이미 있는데 일일히 또 만들면 자원낭비)
이러한 구조로, 값이 사라지고 안사라지고를 잘 기억해서 코딩을 해야 한다.
객체 활용
생성된 객체를 불러오고 사용하기 위해서는 연산자(.)를 사용해서 가져와야 한다.
이 점 하나(.)만 있는 연산자는 포인터 연산자라고 하는 것인데, 해당 변수의 주소로 가는 연산자다.
그러면 아까 객체의 이름은 사실 참조변수이니까, 잠조벼수에 적혀있는 주소로 이동하면 힙 메모리 영역에 잇는 객체들을 만나게 되는 것이다.
사용 예시
참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출
아래에는 해당 연상자를 사용해서 객체를 불러오는 예시이다.
public class food {
public static void main(String[] args) {
Food_1 food1 = new Food_1 ();
Food_1 food2 = new Food_1 ();
food1.FOOD = "양념치킨";
System.out.println(food1.FOOD);
food2.print();
}
}
class Food_1{
public String FOOD = "음식";
public String FOOD_1 = "콜라";
void print(){
System.out.println(FOOD_1);
}
}
// 출력값
양념치킨
콜라
포인터 연산자 (.)를 사용해서 Food_1 클래스의 음식을 양념치킨으로 바꿧고, print 메소드를 불러와 콜라를 출력시켰다.
'백엔드 > JAVA_이론공부' 카테고리의 다른 글
JAVA_메서드 오버로딩(overloading) (1) | 2022.09.04 |
---|---|
JAVA_필드와 메서드 (0) | 2022.09.04 |
JAVA_2차원 배열, 가변 배열 (0) | 2022.09.04 |
JAVA_배열 (0) | 2022.09.04 |
JAVA_반복문 (0) | 2022.09.04 |