객체(Object)
객체란 한마디로 우리가 표현할 수 있는 셀제 세계의 모든 사물들을 말합니다.
ex) 자동차, 동물...
- 물리적 객체 : 눈에 보이고 만질 수 있는 (개, 고양이...)
- 개념적 객체 : 보이지 않고 만질 수 없는 (동물, 자동차...)
클래스(Class)
이러한 객체와 관련된 데이터와 처리 동작을 한데 모은 것입니다.
class Car {
int speed;
int fuel;
void run() {
System.out.println("레츠고");
}
void breakNow() {
System.out.println("당장 멈춰!");
}
}
이러한 클래스를 기술하는 것을 클래스를 정의한다 라고 합니다.
- 클래스는 객체의 설계도와 같은 것으로, 그 자체로는 사용할 수 없습니다.
- 사용하기 위해 설계도를 기초로 실체를 만들 필요가 있습니다.
- 클래스가 실체화된 것을
Object(객체)
라고 하며, 실체화 하는 작업을 오브젝트를 생성한다 또는 인스턴스화 한다 라고 말합니다.
클래스 = 설계도
오브젝트 생성(인스턴스화) = new
실체 = 값(value)
다음 코드는 더하기 결과를 출력하는 클래스입니다.
class Calc {
int add(int a, int b) {
return a + b;
}
}
public class MyNpc {
public static void main(String[] args) {
Calc calc = new Calc();
//리턴한 값을 result에 담습니다. 반드시 리턴타입과 변수타입이 같아야합니다.
int result = calc.add(3, 7);
System.out.println(result);
}
}
패키지(Package)
패키지가 필요한 이유가 무엇일까?
만약 한 회사의 팀이 team1, team2 총 두 팀이 있을 때, 각 팀은 원의 넓이와 원의 둘레를 구하는 class 를 구현하라고 지시를 받았습니다.
다 구현한 뒤에 서로 통합을 하려는데, 문제가 생깁니다.
서로 같은 class 명을 사용했기 때문에 에러가 난 것입니다.
이를 방지하기 위해 패키지를 사용합니다.
- 클래스 접근 방법 구분
- 서로 다른 패키지의 두 클래스는 인스턴스 생성시 사용하는 클래스 변수명이 다릅니다.
- 클래스의 공간적 구분
- 서로 다른 패키지의 두 클래스 파일의 저장되는 위치가 다릅니다.
사용 예시
보통 패키지명은 도메인명의 역순으로 작성합니다.
제 블로그인 azurealstn.tistory.com
이라는 도메인명이 있을 때
패지키명은 다음과 같이 작성합니다
- com.tistory.azurealstn
여기서 패키지명은 모두 소문자이어야 합니다.
오버로딩(Overloading)
오버로딩은 하나의 클래스 내에 파라미터의 개수나 변수타입이 다른 동일한 이름의 메소드를 여러 개 정의하는 것을 의미합니다.
모든 상황에 따라 메소드명을 달리하는 것보다 동일한 메소드명으로 작성하는 것이 보다 쉽고 직관적으로 사용가능하여 편리합니다.
- 코드
class Calc {
int add(int a, int b) {
return a + b;
}
// Overloading
int add(int a) {
return a + 1;
}
// Overloading
double add(double a, double b) {
return a + b;
}
}
public class Calculation {
public static void main(String[] args) {
Calc calc = new Calc();
int result1 = calc.add(3, 7);
int result2 = calc.add(4);
double result3 = calc.add(3.5, 5.5);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}
만약 비슷한 메소드들을 모두 다르게 네임을 지어야 한다면 개발자들이 엄청 불편했을 것입니다.
생성자(Constructor)
생성자란 오브젝트 생성과 함께 자동적으로 호출되는 특수한 메서드입니다.
따라서 직접 생성자를 기술하지 않는 경우에는 인자가 없는 생성자가 자동으로 만들어집니다.
이를 디폴트 생성자라고 합니다.
class Book {
Book() {
}
}
생성자는 가장 흔한 오버로딩(Overloading)의 대상입니다.
만약 매개 변수가 있는 생성자를 만든 경우에, 디폴트 생성자를 호출하면 에러가 발생합니다.
따라서 디폴트 생성자를 호출하기 위해 따로 작성을 해주어야만 합니다!!
- 예제 코드
class Book {
String title;
int price;
int num;
Book() {
title = "자바 기초";
price = 1000;
}
Book(String title, int price) {
// this.title:Book클래스의 변수, 오른쪽 title:Book메서드의 매개변수
this.title = title;
this.price = price;
}
// 복제 생성자, 타입이 Book입니다.
Book(Book book1) {
title = book1.title;
price = book1.price;
}
void print() {
System.out.println("제목 : " + title);
System.out.println("가격 : " + price);
System.out.println("주문수량 : " + num);
System.out.println("합계 : " + price * num);
}
}
public class MyBook {
public static void main(String[] args) {
//Book book = new Book();
Book book = new Book("자바 디자인 패턴", 3000);
book.num = 5;
book.print();
System.out.println();
Book book1 = new Book(book);
book1.num = 3;
book1.print();
}
}
메모리 모델
자바 가상머신(JVM)은 운영체제로부터 할당받은 메모리 공간을 기반으로 자바 프로그램을 실행합니다.
메모리 공간 활용의 효율성을 높이기 위해 메모리 공간을 세 개의 영역으로 구분하였습니다.
- 메소드 영역 : 메소드의 바이트 코드(ByteCode), , static 변수
- 스택 영역 : 지역변수, 매개변수
- 힙 영역 : 인스턴스 (객체)
바이트코드(ByteCode)
바이트코드는 고급언어로 작성된 소스코드를 가상머신이 이해할 수 있는 중간코드로 컴파일한 것을 말합니다. 가상머신은 이 바이트코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일합니다. 어셈블리어에 가까운 형태를 띄고 있습니다.
자바 바이트코드 : 자바 가상머신에 의해 실행되는 코드
메소드 영역
- 메소드의 자바 바이트코드는 JVM이 구분하는 메모리 공간 중에서 메소드 영역에 저장됩니다.
- static 으로 선언된 클래스 변수 역시 메소드 영역에 저장됩니다.
메소드 영역에 저장된 내용은 프로그램 시작 전에 로드되고 종료 시에 소멸됩니다.
스택 영역 (feat. 스택 자료구조)
- 매개변수, 지역변수가 할당되는 메모리 공간
- 프로그램이 실행되는 도중에 임시로 할당되었다가 바로 이어서 소멸되는 특징이 있는 변수가 할당됩니다.
스택 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시에 소멸됩니다.
힙 영역
- 인스턴스(객체)가 생성되는 메모리 공간
- JVM에 의한 메모리 공간의 정리(Garbage Collection)가 이뤄지는 공간
- 할당은 프로그래머가 하지만 소멸은 JVM이 처리
- JVM은 인스턴스의 참조관계를 확인하고 소멸할 대상을 선정
Garbage Collection 에 대해 더 공부할 필요가 있습니다.
접근제한자
- public : 어디서든 인스턴스 생성이 가능합니다.
- default : 동일 패키지로 묶인 클래스 내에서만 인스턴스 생성을 허용합니다.
- private : 동일 패키지도 안되며, 오직 그 클래스 내부에서만 접근이 가능합니다.
- protected : 상속 받은 클래스라면 접근이 가능합니다.
Reference
인프런강좌 > 이재환님의 자바 : 클래스의 이해와 객체지향 프로그래밍
'Java' 카테고리의 다른 글
[자바 라이브 스터디] 01. JVM과 자바 코드 (0) | 2021.09.15 |
---|---|
[자바 라이브 스터디] 00. 자바 기본 공부 계획 (0) | 2021.09.13 |
간략한 JVM에 대한 개념.. (0) | 2021.05.17 |
클래스 활용 (0) | 2020.09.09 |
상속 기초 (0) | 2020.09.09 |
댓글