이 글은 자바의 정석을 읽고 개인적으로 공부한 내용을 정리한 글입니다 :>
Chapter6 객체지향 프로그래밍1
(1) 객체 지향 언어 장점
: 코드의 재사용성이 높고 유지보수가 용이하다.
** 너무 객체지향개념에 얽매여서 고민하기 보다는 일단 프로그램을 기능적으로 완성한 다음 어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지를고민하여 점차 갯너해 나가는 것이 좋다.
(2) 객체와 인스턴스
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 라고 함
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스 라고 함
(3) 객체의 구성요소
- 속성 : member variable, attribute, field, state
- 기능 : method, function, behavior
(4) 인스턴스의 생성과 사용
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; // TV 클래스 타입의 참조변수 t 선언
t = new Tv(); // Tv 인스턴스를 생성한 후, 생성된 Tv 인스턴스의 주소를 t에 저장
class Tv {
// Tv의 속성(멤버 변수)
String color;
boolean power;
int channel;
// Tv의 기능(메서드)
void power() power = !power;
void channelUp() ++channel;
void channelDown() --channel;
}
class Tvtest {
public static void main(String args[]){
Tv t;
t = new Tv();
t.channel = 7 ;
t.channelDown();
}
}
인스턴스는 참조 변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
(5) 객체 배열
class Tvtest {
public static void main(String args[]){
Tv[] tvArr = new Tv[3];
for(int i = 0; i < tvArr.length; i++){
tvArr[i] = new Tv();
tvArr[i].channel = i+10;
}
for(int i = 0; i < tvArr.length; i++){
tvArr[i] = channelUp();
System.out.printf("tvArr[%d].channel=%d\n", i, tvArr[i].channel);
}
* 정리
- 변수 : 하나의 데이터를 저장할 수 있는 공간
- 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
- 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
- 클래스 : 데이터와 함수의 결합
(6) 변수의 종류와 특징
class Variables
{
int iv; // 인스턴스 변수
static int cv; // 클래스 변수
void method()
{
int iv = 0; // 지역 변수
}
}
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수 (Class variable) |
클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 (instance variable) |
인스턴스가 생성되었을 때 | |
지역변수 (local variable) |
클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
(6-1) 클래스 변수와 인스턴스 변수
카드 게임에 사용되는 카드를 클래스로 정의 해보자
class Card {
String kind; // 무늬
int number; // tntwk
static int width = 100;
static int height = 250;
}
인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와 달리, 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유한다.
-> 즉, 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스변수로 선언해야 한다.
(7) JVM 메모리 구조
메서드가 호출 되면 수행에 필요한 만큼의 메모리를 스택에 할당 받는다.
메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
(8) 클래스 메서드와 인스턴스 메서드
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용하는 것에는 static을 붙인다.
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다. -> 메서드 호출시간이 짧아지므로 성능이 샹상된다.
(9) this / this()
- this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다 .
- this() : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
Chapter7 객체지향 프로그래밍2
(1) 상속 inheritance
: 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것
class Parent { int age; }
class child extends Parent { }
class child2 extends Parent { }
class GrandChild extends child { }
(2) super
super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.
* 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구분했듯이 상속받은 멤버와 자신의 멤버가 이름이 같을 때 super를 붙여 구분한다.
class SuperTest {
public static void main(String args[]){
Child c = new Child();
c.method();
}
}
class parent {
int x = 10;
}
class Child extends Parent {
int x = 20;
void method() {
System.out.println(x); // 20
System.out.println(this.x); // 20
System.out.println(super.x); // 10
}
}
- super.x : 조상 클래스로부터 상속받은 멤버변수
- this.x : 자손 클래스에 선언된 멤버변수
(3) super() - 조상 클래스의 생성자
(4) package - 클래스의 묶음
- 하나의 소스파일에는 첫번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
- 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
- 패키지는 물리적으로 클래스파일(.class)을 포함하는 하나의 디렉토리이다.
(5) import
* 소스 파일의 구성
package문
import문
클래스 선언
(6) 제어자
static : 공통적인
final : 변경 X
abstract : 추상의, 미완성
'뚝딱뚝딱 > Java' 카테고리의 다른 글
[Java] 자바의 정석 Chapter 9 java.lang패키지와 유용한 클래스 (0) | 2022.05.23 |
---|---|
[Java] 자바의 정석 Chapter 8 예외처리 (0) | 2022.05.22 |
[Java] 자바의 정석 Chapter1 ~ Chapter5 (0) | 2022.05.13 |
[Java] assertThat 비교 #JUnit #Assertj (0) | 2022.01.19 |
[Java] Arrays.sort() 재정의하기 / Comparator 재정의 / 정렬 조건 바꾸기 (0) | 2022.01.19 |