# static 변수
1. 공통으로 사용하는 변수
ex) 카드회사에서 카드를 발급할 때마다 카드에 순차적인 새로운 카드 번호를 입력 (serialNum)
ex) static int serialNum = 1000;
2. 인스턴스가 생성될 때 만들어지는 변수가 아니라, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당한다.
3. 클래스 변수, 정적 변수라고도 한다.
4. 인스턴스의 생성과는 상관 없이 사용이 가능하므로 클래스 이름으로 직접 참조한다.
ex) Student.serialNum = 100;
# static 변수를 private으로 선언하게 되면 getter / setter를 구현한다.
# 지역 변수 (로컬 변수)
1. 함수의 내부에 선언된다.
2. 함수의 내부에서만 사용된다.
3. 스택 메모리에 할당
4. 함수가 호출될 때 생성, 함수가 끝날 때 소멸
# 멤버 변수 (인스턴스 변수)
1. 클래스의 멤버 변수로 선언된다.
2. 클래스 내부에서 사용되고, private이 아닐 경우 참조 변수로 다른 클래스에서 사용 가능하다.
3. 힙 메모리에 할당
4. 인스턴스가 생성될 때 생성, garbage collector가 메모리를 수거할 때 소멸
# static 변수 (클래스 변수)
1. static 예약어를 사용하여 클래스 내부에서 선언된다.
2. 클래스 내부에서 사용되고, private이 아닐 경우 클래스 이름으로 다른 클래스에서 사용 가능하다.
3. 데이터 영역
4. 프로그램이 처음 시작할 때 상수와 함께 생성, 프로그램이 끝나고 메모리를 해제할 때 소멸
※ 상황에 적절하게 알맞은 변수를 사용해야 한다.
# 싱글톤 패턴 ( Singleton Pattern )
1. 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
2. static 변수, 메서드를 활용하여 구현할 수 있다.
# 배열 ( Array )
1. 동일한 자료형이 순차적으로 배열되어 있는 자료 구조
2. 물리적 위치와 논리적 위치가 동일하다.
3. 인덱스 연산자[]를 이용해 몇 번째 요소를 꺼내오는 데 빠르다. ( 빠른 참조 가능)
4. 배열의 순서는 0 부터 시작한다.
5. 배열 중간에 데이터가 없으면 안된다.
6. 중간에 데이터가 들어가거나 빠질 때 오퍼레이션이 좀 걸린다.
7. 자바에서는 객체 배열을 구현한 ArrayList를 많이 활용한다.
# 배열의 길이와 요소의 개수는 동일하지 않을 수 있다.
1. 배열을 선언하면 그 개수 만큼의 메모리는 할당되지만, 일부 메모리에만 데이터가 있는 경우가 있다.
ex ) 배열의 길이는 10이지만, 데이터는 6까지만 있는 경우
2. 배열의 legth 속성은 배열의 개수를 반환해주기 때문에 요소의 개수와는 다르다.
# 향상된 for문
배열의 n개 요소를 0부터 n-1까지 순차적으로 순회할 때 간단하게 사용할 수 있다.
for ( 변수 : 배열 ) {}
# 배열을 new 하면 저절로 초기값이 설정된다.
1. int --> 0
2. double --> 0.0
3. 객체 --> null
# 객체에서 배열을 사용해줄 때는 각 배열의 요소에 직접 객체를 저장해줘야 한다.
# 객체 배열 복사
1. System.arrayCopy(src, srcPos, dest, destPos, length) : 얕은 복사, 객체의 주소만 복사되기 때문에 한 쪽 배열의 요소를 수정하면 복사한 배열도 같이 수정된다. 즉, 두 배열이 같은 객체를 가리킨다.
2. 깊은 복사 : 각각의 객체를 생성하고 그 객체의 값을 복사하여 배열이 서로 다른 객체를 가리키도록 한다.
# 2차원 배열
# java.util 패키지에서 제공되는 ArrayList
기존 배열 사용 방식은 배열의 길이가 요소의 개수보다 작으면 배열을 재할당하고 복사를 해야했고, 배열의 요소를 추가하거나 삭제하면 다른 요소들의 이동에 대한 구현을 해야했다. 이러한 점을 좀 더 효율적으로 관리하기 위해 자바에서 제공해주는 클래스가 바로 ArrayList이다.
# ArrayList의 주요 메서드
# ArrayList를 활용한 간단한 예제
# ArrayList를 활용한 심화 예제 ( 성적 산출 프로그램 )
# 클래스 상속
1. 이미 구현된 클래스를 상속받아 속성이나 기능을 확장하여 새로운 클래스를 구현한다.
2. 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야할 때 기존의 클래스를 상속받는다.
상위 클래스가 하위 클래스에게 상속한다. = 하위 클래스가 상속 클래스에게 상속받는다.
상위 클래스 : 상속하는 클래스, parent class ex) 포유류
하위 클래스 : 상속받는 클래스, child class ex)사람
# 상속의 문법
class B extends A {
}
1. extends 키워드 뒤에는 단 하나의 클래스만 올 수 있다.
2. Java는 단일 상속만을 지원한다.
※ 코드에 if - else if 가 많다면, 상속 사용을 고려해봐야 한다.
# protected 접근 제어자
1. 상위 클래스에서 선언된 private 멤버 변수는 하위 클래스에서 접근할 수 없다.
2. 그렇기 때문에, 외부 클래스는 접근할 수 없지만, 하위 클래스는 접근할 수 있도록 protected 접근 제어자를 사용한다.
# 하위 클래스의 생성 과정
1. 하위 클래스를 생성하면 상위 클래스가 먼저 생성된다.
2. 클래스가 상속받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 먼저 호출한다.
# super 키워드
1. 하위 클래스에서 가지는 상위 클래스에 대한 참조값이다.
2. super(); 는 상위 클래스의 기본 생성자를 호출한다.
3. 상위 클래스에 기본 생성자가 존재하면, 하위 클래스에서는 자동으로 super(); 가 호출된다.
4. 상위 클래스에 기본 생성자가 아닌 직접 구현한 생성자가 존재하는 경우, 하위 클래스에서는 super 키워드를 이용하여 명시적으로 상위 클래스의 생성자를 호출해줘야 한다.
5. super 키워드는 생성된 상위 클래스 인스턴스의 참조값을 가지므로 super 키워드를 이용하여 상위 클래스의 메서드나 멤버 변수에 접근할 수 있다.
※ 항상 상위 클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가 생성된다.
# 형 변환 ( 업캐스팅 )
1. 상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성
ex) Customer customerLee = new VIPCustomer();
※ 다운 캐스팅이 필요한 경우는, 타입이 상위 클래스이고 하위 클래스의 변수 사용이 필요한 경우이다.
2. 상위 클래스 타입의 변수에 하위 클래스 변수가 대입
ex) VIPCustomer customerLee = new VIPCustomer();
int addCustomer(Customer customer){
}
3. 상속받는 하위 클래스는 상위 클래스의 타입을 이미 내포하고 있으므로 상위 클래스로의 묵시적 형 변환이 가능하다.
4. 상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환이 된다. ( 그 역은 성립하지 않는다. )
※ Customer vc = new VIPCustomer(); 에서 vc가 가리키는 것은?=> VIPCustomer() 생성자에 의해 VIPCustomer 클래스의 모든 멤버 변수에 대한 메모리는 생성되었지만, 변수의 타입이 Customer이므로 실제 접근 가능한 변수나 메서드는 Customer의 변수와 메서드이다.
# 오버라이딩 ( Overriding, 재정의 )
1. 엎어쓴다는 뜻이다.
2. 상위 클래스에서 정의된 메서드 내용이 하위 클래스에서 정의할 메서드 내용과 맞지 않을 경우, 하위 클래스에서 동일한 이름의 메서드를 오버라이딩(재정의)할 수 있다.
3. 오버라이딩을 한 메서드의 선언부는 기존의 메서드 선언부와 같아야 한다. 다를 경우, 에러가 난다.
# Customer vc = new VIPCustomer();
1. vc 변수의 타입은 Customer이지만, 인스턴스의 타입은 VIPCustomer이다.
2. Java의 모든 메서드는 가상 메서드(Virtual Method)이다.
3. 위와 같이 생성된 인스턴스를 활용해 vc. 을 입력해보면 사용할 수 있는 변수와 메서드는 모두 Customer 클래스의 것이다. 만약에, Customer 클래스의 메서드가 VIPCustomer클래스에 재정의되어 있다면, VIPCustomer클래스의 재정의된 메서드로 구현이 된다. (Java에서는 항상 인스턴스의 메서드가 호출이 된다. ===> 가상 메서드의 원리)
# 메서드는 어떻게 호출되고 실행되나?
1. 메서드의 이름은 주소값을 나타낸다.
2. 메서드는 명령어의 set이고 프로그램이 로드되면 메서드 영역(코드 영역)에 명령어 set이 위치한다.
3. 해당 메서드가 호출되면 명령어 set이 있는 주소를 찾아 명령어가 실행된다.
4. 이때 메서드에서 사용하는 변수들은 스택 메모리에 위치하게 된다.
5. 메서드의 코드는 같지만, 인스턴스가 다르더라도 호출되는 메서드는 동일한 한 개의 메서드이다. ( 즉, 같은 메서드를 호출하게 되는 것이다. )
6. 인스턴스가 생성되면 변수는 힙 메모리에 따로 생성이 되지만, 메서드 명령어 set은 처음 한 번만 로드된다.
# 가상 메서드 ( Virtual Method ) 의 원리
# 다형성 ( PolyMorphism )
1. 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
2. 하나의 같은 코드에서 여러 다른 실행 결과가 나온다.
3. 정보은닉, 상속과 더불어 OOP(객체지향 프로그래밍)의 가장 큰 특징 중 하나이다.
4. 다형성을 잘 활용하면 유연하고 확장성 있고, 유지보수가 편리한 프로그램을 만들 수 있다.
# 다형성을 사용하는 이유
1. 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있다.
2. 다형성을 이용하지 않으면, if - else if 문을 많이 구현할 수 밖에 없고, 그렇게 되면 유지보수가 어려워진다.
3. 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능을 구현한다.
4. 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링할 수 있다.
# 다형성을 활용한 고객 멤버십 프로그래밍 예시
'생각 정리' 카테고리의 다른 글
[패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강_6주차 학습일지 (0) | 2022.07.21 |
---|---|
[패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강_5주차 학습일지 (0) | 2022.07.14 |
[패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강_4주차 학습일지 (0) | 2022.07.07 |
[패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강_2주차 학습일지 (0) | 2022.06.22 |
[패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강_1주차 학습일지 (0) | 2022.06.16 |