사실 오늘은 Java 기초의 마지막 part인 solid를 학습해야 하지만, 아직 부족한 나는 객체지향을 복습하고 넘어가기로 했다!
클래스와 객체
클래스란? - 객체를 정의한 것 (객체 자체는 아님) 클래스 용도 - 객체 생성 |
객체란? - 사물 또는 개념 객체의 용도 - 객체가 가지고 있는 기능과 속성에 따라 다름 |
객체의 구성요소
변수 (속성) | String color; // 색깔 boolean power; // 전원상태 int channel; //채널 |
메서드 (기능) | void power() { power = !power; } void channelUp() { channel++; } void channelDown() { channel--; } |
객체와 인스턴스
인스턴스화 클래스 ----------------------------> 인스턴스(객체) |
(클래스로부터 객체를 만드는 과정 = 인스턴스화, 클래스로부터 만들어진 객체 = 클래스의 인스턴스) ∴ (객체 = 인스턴스)
클래스가 왜 필요한가? => 객체를 생성하기 위해 |
객체는 왜 필요한가? => 객체를 사용하기 위해 |
객체를 사용한다는 것은? => 객체가 가진 속성과 기능을 사용 |
객체의 생성과 사용
Tv t; // Tv 클래스 타입의 참조변수 t 선언
t = new Tv(); // Tv인스턴스(객체)를 생성 후, Tv인스턴스 주소를 t에 저장
// 위의 코드를 간단화하면
Tv t = new Tv(); // Tv 객체 생성, 변수타입 Tv와 객체이름 Tv를 꼭! 일치시켜줘야한다.
t.channel = 7; // 객체 사용 (객체의 멤버 변수를 사용)
t.channelDown(); // 객체 사용 (객체의 멤버 메서드를 사용)
객체배열
=> 객체배열 == 참조변수 배열
Tv tv1, tv2, tv3; | Tv [] tvArr = new Tv [3]; |
Tv [] tvArr = new Tv[3]; // 참조변수 배열 (객체배열) 생성 == Tv타입의 참조변수 X 3
// 객체를 생성하여 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[0] = new Tv();
// 배열의 초기화 블럭을 사용하여 간단히 하면
Tv [] tvArr = { new Tv(), new Tv(), new Tv() }; // 배열의 초기화
선언위치에 따른 변수의 종류
class Variables { // 클래스 영역 시작
int iv; // 인스턴스 변수 (iv)
static cv; // 클래스 변수 (cv)
void method() { // 메서드 영역 시작
int lv = 0; // 지역변수 (lv)
} // 메서드 종료
} // 클래스 종료
변수의 종류 | 선언 위치 | 생성시기 |
클래스 변수 (cv) - 공통속성 (사람은 손과 발을 모두 가지고 있지) |
클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 (iv) - 개별속성 (하지만, 손과 발 크기는 모두 다르지) |
인스턴스가 생성될 때 (객체 생성시) | |
지역변수 (lv) | 클래스 영역 이외 (메서드 영역) |
변수 선언문이 수행되었을 때 |
클래스 변수 - 인스턴스를 생성하지 않고, 언제라도 바로 사용 가능 == 객체를 생성하지 않아도 언제든지 사용 가능
인스턴스 변수 - 인스턴스를 생성해야지 사용 가능 == 객체 생성 후 사용 가능
지역변수 - 지역변수가 선언된 블럭 { } 내에서만 사용 가능, 블럭 { } 을 벗어나면 소멸~
메서드(method) - 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
// 반환타입(int) 메서드 이름(add) 매개변수(int x, int y)
int add (int x, int y) {
int result = x + y;
return result;
}
메서드 호출
메서드 이름 (값1, 값2, ...) // 메서드를 호출하는 방법
//(값1, 값2, ...== 작업에 필요한 값들)
add(); // void add()를 호출
return문 - 반환타입이 void가 아닌 경우, 즉 반환값이 있는 경우, 반드시 return 문이 있어야한다!
void printGugudan (int dan) {
for (int i = 1; i <= 9; i++) {
System.out.printf(%d * %d = %d%n, dan, i, dan * i);
}
return; // 반환타입이 void 이므로 생략 가능! but 반환타입이 void가 아닐 경우 생략 불가
}
int add (int x, int y) { // 반환타입이 void가 아닌 int 타입
int result = x + t;
return result // 반환타입이 int 이므로 return 문 작성 필수! // 반환타입과 결과값 타입일치 필수!
}
호출스택
public static void main(String[] args) {
System.out.println("Hello!");
}
코드 호출스택 순서
println (Hello!) | ||||
main | main | main | ||
① | ② | ③ | ④ | ⑤ |
- 메서드가 호출되면 수행에 필요한 만큼 메모리를 스택에 할당받는다.
- 메서드가 수행을 마치고나면 사용했던 메모리를 반환
- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.
참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.
static 메서드와 인스턴스 메서드
static 메서드(클래스 메서드)
- 인스턴스 (객체)생성 없이 '클래스 이름. 메서드 이름()' 으로 호출가능
- 인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)와 관련 없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수 사용 불가 (클래스 메서드 호출 시 인스턴스(객체)가 존재하지 않을 수도 있기 때문)
인스턴스 메서드
- 인스턴스를 생성한 후, '참조변수.메서드이름()' 으로 호출
- 인스턴스 멤버 (인스턴스 변수, 인스턴스 메서드)와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수 (iv) 사용 가능
class TestClass2 {
int iv; // 인스턴스 변수 => 객체(인스턴스) 생성 후 사용 가능
static int cv; // 클래스 변수 => 언제든지 사용 가능
void instanceMethod(int iv) { // 인스턴스 메서드 => 객체 생성 후 호출 가능
System.out.println(iv); // 인스턴스 변수(iv) 사용 가능
System.out.println(cv); // 클래스 변수(cv) 사용 가능
}
static void staticMethod() { // static 메서드 => 객체 생성없이 사용 가능(iv 사용 불가)
System.out.println(iv); // Error! 인스턴스 변수 (iv) 사용 불가
System.out.println(cv); // 클래스 변수는 사용 가능
}
}
오버로딩 (overloding)
- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의한 것!
오버로딩 성립조건
- 메서드의 이름이 같아야한다.
- 매개변수의 개수 또는 타입이 달라야한다.
- 반환 타입은 관계없다.
int add (int a, int b) { return a + b; } // 중복정의
int add (int x, int y) { return x + y; }
int add (int a, int b) { return a + b; } // 중복정의
long add (long a, long b) { return (long)a + b; }
long add (int a, long b) { return a + b;} // 오버로딩 성립
long add (long a, int b) { return a + b;} // 매개변수 타입에 의해 호출 메서드 구분 가능!!
생성자 - 인스턴스가 호출될 때 생성되는 인스턴스 ( = 객체 = iv 묶음) 초기화 메서드이다!
- 생성자의 이름은 클래스의 이름과 같아야한다.
- 생성자는 리턴 값이 없다.
- 모든 클래스는 반드시 생성자를 가져야한다!
기본 생성자 - 매개변수도 없고 아무런 내용도 없는 생성자
( 클래스이름 ( ) { } => point ( ) { } )
매개변수가 있는 생성자
Car c = new Car ( ); c.color = "white"; c.gearytpe = "auto"; c.door = 4; |
Car c = new Car ( "white", "auto", 4); |
this - 인스턴스(객체) 자신을 가리키는 참조변수
- 인스턴스 메서드(생성자 포함) 에서 사용 가능
- 지역변수와 인스턴스 변수를 구별할 때 사용
- 인스턴스 멤버만이 this를 사용할 수 있다.
this () - 생성자에서 다른 생성자를 호출할 때 사용
- 생성자의 이름으로 클래스이름 대신 this를 사용
- 반드시 첫 줄에서만 호출이 가능
변수의 초기화 - 변수를 선언하고 처음으로 값을 저장하는 것
- 선언과 동시에 적절한 값으로 초기화 하는 것이 좋다
- 멤버변수는 초기화를 하지 않아도 자동으로 변수의 자료형에 맞게 기본값으로 초기화 된다. (선택사항)
- 클래스 변수 : 클래스가 처음 로딩될 때 단 한번만 초기화
- 인스턴스 변수 : 인스턴스(객체)가 생성될 때 마다 초기화
- 지역변수는 사용 전에 반드시! 수동으로 초기화해야 한다. (필수사항)
초기화 방법
명시적 초기화 ( = ) : 선언과 동시에 초기화를 하는 것
clss Car {
int door = 4; // 기본형 변수 초기화
Engine 3 = new Engine(); // 참조형 변수 초기화
}
초기화 블럭 ( { } )
- 클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용
- 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용
'ssung_항해일지 > 항해99_언어학습(Java)' 카테고리의 다른 글
Java - 4일차 (0) | 2023.01.26 |
---|---|
Java : 설 연휴 복습 - 마지막 (0) | 2023.01.25 |
Java : 설 연휴 복습 - 3일차 (0) | 2023.01.24 |
Java : 설 연휴 복습 - 2일차 (0) | 2023.01.23 |
Java : 설 연휴 복습 - 1일차 (1) | 2023.01.22 |