❯ 클래스(Class)와 객체(Object)
객체는 모든 실재하는 어떤 대상을 의미함
객체지향이론의 핵심은 "실제 세계는 객체로 구성되어있으며 사건은 객체간 상호작용에 의한것"을 전제로 함
=> 프로그래밍 관점에서 보면, 필요한 데이터를 상태와 행위를 가진 객체로 만들고 그 객체들 간의 협력과 상호작용을 통해 기능을 구성함
클래스
클래스: 객체를 정의한 설계도, 틀의 역할. 객체를 생성하는데 사용됨
객체 그 자체가 아니라 객체를 생성하는데 사용되는 틀임. ex. 클래스(붕어빵 틀), 객체(붕어빵)
객체: 클래스를 통해 생성된 객체를 해당 클래스의 인스턴스(instance)라고 함.
객체는 모든 인스턴스를 포괄하는 넓은 의미이며, 인스턴스는 해당 객체가 어떤 클래스에서 생성되었는지를 강조함.(두가지 유사함)
- 클래스 구성요소와 기본 문법
class 클래스명 { // 클래스 정의
int i = 0; // 필드: 클래스의 속성을 나타내는 변수
void printSum() {...} // 메서드: 클래스의 기능을 나타내는 함수
클래스명 {...} // 생성자: 클래스의 객체를 생성하는 역할
class 클래스명2 {...} // 이너클래스: 클래스 내부의 클래스
}
클래스는 class 키워드를 사용해 정의함. 첫글자는 주로 대문자를 사용함
클래스의 요소는 크게 네가지로 필드(field), 메서드(method), 생성자(constructor), 이너클래스(inner class)로 구분됨
생성자를 제외한 3개 요소(필드, 메서드, 이너클래스)를 멤버(member)라고 명명함
객체
속성(필드)과 기능(메서드)를 가지며, 일반적으로 하나의 객체는 다양한 속성과 기능의 집합으로 이루어짐.
객체 생성은 new 키워드를 통해 가능하며 생성 이후에는 포인트 연산자(.) 를 활용해 해당 객체의 멤버에 접근이 가능함
(접근 제한자에 따라 달라질 수 있음)
객체의 생성
Menu lunch; // Menu 클래스 타입의 참조변수 lunch를 선언함
lunch = new Menu(); // 인스턴스를 생성하고 생성된 인스턴스의 주소를 참조변수에 저장함
참조변수는 값 그자체를 저장하는것이 아니라 실제 데이터가 위치한 힙메모리의 주소를 저장하는 변수임
따라서, 객체를 생성하는 것은 해당 객체를 힙메모리에 넣고 주소값을 참조변수에 저장하는것을 의미함
반면 메서드 구현 코드는 클래스 영역에 저장되므로 같은 클래스로 만든 객체는 동일한 메서드를 공유함.
객체의 활용
객체의 필드, 메서드를 (.) 연산자를 활용해 사용할 수 있음 (접근 제한자에 따라 달라질 수 있음)
참조변수명.필드명 // 필드값 불러오기
참조변수명.메서드명() // 메서드 호출
❯ 필드(Field)와 메서드(Method)
필드
필드: 클래스에 포함된 변수를 의미. 개체 속성을 정의할때 사용
변수는 클래스 변수(class variable), 인스턴스 변수(instance variable), 지역변수(local variable)로 구분되는데,
이 중 클래스 변수(class variable), 인스턴스 변수(instance variable)를 필드라고 구분함.
- 클래스 변수: static을 통해 선언함. static 은 '정적(고정)'의 의미를 가짐.
클래스 변수는 클래스 영역에 저장되므로 객체간에 공유되는 값임. 한 클래스에서 생성된 모든 인스턴스들이 특정값을 공유해야하는
경우 static을 사용해 클래스 변수로 선언함. 클래스 변수를 변경하면 모든 인스턴스에 변경값이 적용됨
클래스영역에 바로 저장되므로 인스턴스를 생성하지 않아도 "클래스명.클래스 변수명"을 통해 사용가능함 - 인스턴스 변수: 인스턴스가 가지는 각각의 고유 속성을 저장하기 위한 변수. new 생성자() 로 인스턴스가 생성될 때 만들어짐
인스턴스는 힙메모리의 독립적 공간에 저장되고, 객체 고유의 개별성을 가짐. / 인스턴스 변수 변경해도 다른 인스턴스엔 영향 없음 - 지역 변수: 메서드 내에서 선언되며 메서드 블록 {...} 안에서만 사용가능한 변수. 스택메모리에 저장되어 메서드 종료와 함께 소멸됨
[인스턴스변수와 지역변수의 차이]
지역변수: 스택 메모리에 저장. 강제로 초기화 되지 않으므로 지역변수 선언시 직접 초기화를 해야함
인스턴스변수: 힙 메모리에 저장. 힙 메모리는 빈 공간이 저장될 수 없기때문에 강제로 초기화됨
static 키워드
static가 붙어있는 멤버를 정적멤버(static member)라고 명명함
인스턴스 멤버는 반드시 객체 생성 이후에 사용가능한 반면, 클래스 멤버는 인스턴스 생성 없이도 사용 가능함
class Example{
static int num = 10;
} // 인스턴스 생성 없이 Example.num으로 바로 호출이 가능함
정적 필드는 객체간 공유 변수의 성질이 있으므로, static 변수/메서드를 변경하면 모든 인스턴스에 공통적으로 적용됨
정적 메서드 내부에서 인스턴스 변수나 메서드를 사용할 수 없음(호출시 인스턴스가 존재하지 않는 경우도 있기때문)
메서드
메서드: 특정 작업을 수행하는 명령문들의 집합. 시그니처(signiture) 와 바디(body) 로 구분됨
public static int example(int a, int b){ // 메서드 시그니처, 반환타입은 int, 메서드명은 example, 매개변수는 int a, int b
int result = a + b; // 메서드 바디
return result;
}
메서드 반환타입이 void(반환값이 없는 메서드) 가 아닌 경우는 메서드 바디에 반드시 return 문이 존재해야함
메서드 호출시 메서드도 클래스의 멤버이므로 클래스 외부에서 사용하기 위해서는 인스턴스를 생성해야함.
클래스 내부에 있는 메서드끼리는 객체 생성 없이도 서로 호출 가능함.
메서드 호출시 매개변수 위치에 들어가는 값을 인자(argument)라고 하는데 인자 순서와 개수는 정의할때 선언된 매개변수와 일치해야함
메서드 오버로딩
하나의 클래스 안에 같은 이름의 메서드를 여러개 정의하는것.
메서드 이름이 같으면서 동시에 매개변수의 개수 또는 타입이 다를 경우 성립(반환타입이 다른것은 다른 메서드로 인식하지 않음)
ex. println(): 매개변수로 입력된 값의 타입(문자열, 숫자, 논리형 등)에 따라서 다른 메서드가 실행됨
오늘은 드디어 객체지향 프로그래밍 기초 과정에 들어갔다.
이전에 코드들을 작성하면서 '이건 왜 작성하는거지?'싶었던 내용들을 다룰 수 있어서 모호했던 개념들을 더 확고히 할 수 있었다.
하루하루 너무나도 빠르게 지나가서 하루가 3시간정도만 더 있었으면 하는 생각도 든다. 우선 현재 주어진 시간에 최선을 다해야겠다!
오늘은 객체지향 프로그램에 있어서 기초중의 기초 내용이었음에도 메모리 위치나 클래스 구조같은것들이 한번에 쉽게 이해되지는 않았다.
더욱 명확하게 이해할 수 있도록 반복 심화학습이 많이 필요할것같다.
'부트캠프 개발일기 > Java' 카테고리의 다른 글
11일차: 객체지향 프로그래밍 심화(상속/Inheritance, 캡슐화/Encapsulation) (0) | 2023.02.27 |
---|---|
10일차: 객체지향 프로그래밍 기초(생성자, 내부클래스) (0) | 2023.02.24 |
8일차: Java 기초(배열) (0) | 2023.02.22 |
7일차: Java 기초(반복문/for, while, do-while) (0) | 2023.02.21 |
6일차: Java 기초(연산자, 콘솔I/O, 조건문/if, switch) (0) | 2023.02.20 |