Class
: 공통 성질을 가진 대상들의 정의
속성(필드, 변수)
: 해당 클래스의 객체(인스턴스)가 가질 수 있는 정보나 상태
유형
- 인스턴스 변수
: 각 인스턴스가 독립적으로 가질수 있는 속성
특징 : 반드시 인스턴스가 생성된 후에 인스턴스로 사용할 수 있음
int instanceVariable; // 데이터타입 인스턴스 변수;
- 클래스 변수
: 같은 클래스로 생성된 인스턴스가 공유하는 속성
: static 키워드를 사용하여 선언
특징 : 클래스로 직접 사용할 수 있고 인스턴스에서도 사용할 수 있음
static int staticVariable; // static 데이터타입 스테틱변수;
메서드(기능)
: 해당 클래스가 수행할 수 있는 작업이나 행동
: 반환타입 메서드명 (매개변수) { 메서드가 수행할 작업 }'
유형
-인스턴스 메서드
: 각 인스턴스가 독립적으로 수행하는 기능
특징
: 인스턴스가 생성된 후에 사용할 수 있음
: 일반적으로 인스턴스 변수를 사용하는 기능을 구현할 때 사용
void instanceMethod() { }
- 클래스 메서드
: 같은 클래스로 생성된 인스턴스가 공유하는 기능
: static 키워드를 사용하여 선언
특징
: 인스턴스 변수를 사용할 수 없음
: 인스턴스 생성 없이 호출이 가능
* 이유 : static 메서드는 항상 호출이 가능해야 하는데,
클래스 메서드 호출되었을 때, 인스턴스가 존재하지 않을 수도 있기 때문
: 클래스로 직접 사용할 수 있고 인스턴스로도 사용할 수 있음
static void staticMethod() { }
생성자
: 클래스의 인스턴스를 생성할 때 호출되는 메서드
: 생성시에 실행할 코드를 구현한 메서드
: 일반적으로 인스턴스 변수 초기화 작업에 사용
: 생성자를 개발자가 직접 작성하지 않으면 자바가 기본 생성자를 자동으로 생성
: 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 함
규칙
1. 클래스명과 동일한 이름을 가져야 함
2. 반환타입을 지정하지 않음
3. 인스턴스 생성 후에 사용할 수 없음
* 이유 : 의존성 내부에서 주입상태인데 외부에서 주입이 불가하기 때문
ConstructorClass () {
// 아래와 같은 상황을 '의존성을 내부에서 주입한다'라고 함
// 의존성을 내부에서 주입하는 상황은 지양해야 함
this.instanceVariable1 = 10;
this.instanceVariable2 = 9.9;
}
참조 변수 this
: 현재 인스턴스 혹은 클래스를 가리키는 키워드
: 글로벌 위치(지역변수)에 있는 변수 혹은 메서드를 지정할 때 사용
: 인스턴스 자신을 가리키는 참조 변수
ConstructorClass (int instanceVariable1) {
this.instanceVariable1 = instanceVariable1;
}
* 생성자도 메서드이기 때문에 오버로딩이 가능
생성자 this
: 생성자에서 다른 생성자를 호출할 때 사용
: 다른 생성자 호출시 첫 줄에서만 사용 가능
사용 이유
: 코드의 중복을 제거하기 위해
ConstructorClass (int instanceVariable1, double instanceVariable2) {
// this() : 현재 클래스의 다른 생성자를 호출하는 키워드
this(instanceVariable1);
this.instanceVariable2 = instanceVariable2;
}
public class A_Constructor {
public static void main(String[] args) {
// 생성자 사용
ConstructorClass instance1 = new ConstructorClass(); // 내부의존성
ConstructorClass instance2 = new ConstructorClass(1); // 외부 의존성 매개변수 1개
ConstructorClass instance3 = new ConstructorClass(1, 1.1); // 외부 의존성 매개변수 2개
System.out.println(instance1.instanceVariable1); // 10 // 내부에서 정의된 값을 불러옴
System.out.println(instance1.instanceVariable2); // 9.9
System.out.println(instance2.instanceVariable1); // 1 // 외부에서 정의된 값을 불러옴
System.out.println(instance3.instanceVariable1); // 1
System.out.println(instance3.instanceVariable2); // 1.1
}
}
객체(인스턴스)
: 클래스에 정의된 대로 만들어진 독립적인 실체
: 클래스로 '생성'하는 작업이 이루어짐
: new 연산자를 사용하여 생성 - new 클래스명()
ExampleClass instance = new ExampleClass();
* instance라는 이름의 참조 변수를 선언
* new ExampleClass()라는 인스턴스 변수를 선언
변수를 선언
int number;
ExampleClass example;
인스턴스
new ExampleClass();
인스턴스의 변수와 메서드 접근 혹은 호출 : 인스턴스 변수 / 인스턴스.메서드()
instance.instanceVariable = 0;
instance.instanceMethod();
new ExampleClass().instanceVariable = 0;
* new ExampleClass() 인스턴스여서 수식은 가능하나 주소가 담겨 있지 않다.
ExampleClass anotherInstance = instance; // 인스턴스 복사X, 주소 복사
오버로딩
: 하나의 클래스 내부에서 같은 이름의 메서드를 여러개 가질수 있도록 하는 것
조건
1. 메서드의 이름이 같아야함
2. 매개변수의 조합이 달라야함 (타입, 객수, 타입의 순서)
3. 반환타입과 매개변수의 이름은 오버로딩에 영향을 주지 않음
장점
1. 코드의 일관성과 가독성을 향상
2. 다형성 지원으로 코드의 확장성을 향상
void method() {}
void method (int arg) {}
void method (double arg) {}
void method (int arg1, double arg2) {}
void method (double arg1, int arg2) {}
오버로딩을 할 수 없는 것
: 매개변수의 개수와 타입은 같고, 리턴타입이 다른 경우는 오버로딩이 성립되지 않음
int method() {} // 리턴값 void을 선언해둔 상태에서 다른 타입을 선언할 수 없다.
void method (int prarmeter)
// void method (int arg) {} 값이 정의되어 있어
// 같은 타입인 int prarmeter 는 오버로딩이 성립되지 않는다
JVM
JVM의 메모리 구조
메서드 영역
: 모든 쓰레드가 공유하며 클래스의 구조 정보와 static으로 선언된 변수 혹은 메서드가 저장되는 공간
합 영역
: 모든 쓰레드가 공유하며 클래스로 생성된 인스턴스와 배열이 저장되는 공간
(가비지 컬렉션의 주요 대상)
: 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
스택 영역 :
: 각 쓰레드 별로 존재하는 공간 ( 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역)
: 로컬 변수나 메서드 호출 데이터가 저장되는 공간 (각 메서드가 종료되면 제거 됨)
: 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
메서드 영역에 저장되는 클래스 구조
class Class {
// 클래스 변수의 데이터는 '메서드 영역'에 저장
static int staticVariable;
// 인스턴스 변수는 구조 정보만 '메서드 영역'에 저장된다. // 데이터 저장X 정보만 저장
int instanceVariable;
}
클래스 메서드의 구현 데이터는 '메서드 영역'에 저장된다.
static void staticMethod() {}
인스턴스 메서드의 구조 정보만 '메서드 영역'에 저장된다.
void instanceMethod () {}
public class 안에서 정의되는 데이터는 스택 영역에 저장
public class A_JVM {
// 메인 메서드 실행되면 실행시 필요한 데이터는 '스택 영역'에 저장된다.
public static void main(String[] args) {
// 지역 변수의 데이터는 '스택 영역'에 저장된다.
int number = 0;
// 지역 참조 변수는 '스택 영역'에 저장된다.
// 실제 인스턴스는 '힙 영역'에 저장된다.
Class instance = new Class();
// 호출한 메서드가 실행되면 실행시 필요한 데이터는 '스택 영역'에 저장된다.
// 호출한 메서드가 종료되면 스택 영역에서 자동으로 제거
instance.instanceMethod();
}
}
* 참조형으로 복사되서 넘겨지는 것은 주소가 넘겨진 것이다.
* 스택 영역으로 반환되면 원본이 삭제
→ 함수의 호출과 함께 메모리에 할당되며, 함수 호출이 완료되면 소멸
* 힙 영역으로 반환되면 스택영역에서 제거되도 주소가 넘겨진 것이기에 원본이 남아 있음
'AWS(산대특)' 카테고리의 다른 글
DAY 7 - JAVA (0) | 2024.01.28 |
---|---|
DAY 6 -JAVA (0) | 2024.01.25 |
DAY 5 -JAVA (0) | 2024.01.24 |
JAVA class 만들기 (0) | 2024.01.23 |
DAY 4 - JAVA (0) | 2024.01.23 |