[객체지향] 객체란?
실제로 존재하는 유형의 물체 혹은 무형의 개념/이론을 통칭하는 말이다.
[객체지향] 소프트웨어란?
변화가능 한 것. 하지만, 시간이 지남에 따라 변화에 대한 비용이 줄어들어야 하는 것.
시간이 지남에 따라 변화에 대한 비용이 늘어난다면, 잘못된 소프트웨어일 확률이 높다.
객체지향은 변화에 대한 비용을 감소시키기 위한 디자인패턴 중 하나이다.
[Java] 생성자?
생성자는 new
키워드를 이용해 인스턴스를 초기화 메서드이다. 생성자로 정의된 매개변수를 통해 이 객체가 생성된 의도를 파악 할 수 있음.
[Java] 클래스? 인스턴스? 객체?
클래스 | 인스턴스 | 객체 |
---|---|---|
인스턴스를 정의한 명세이다. | 클래스를 new 키워드를 이용하여 실체화 시킨 객체이다. | 인스턴스를 총칭하는 포괄적 개념이다. |
붕어빵 틀로 많이 부르곤 한다. | 실체화 하는 과정을 '인스턴스화' 한다고 칭하며, 인스턴스는 JVM의 힙에 저장되어 사용된다. | 객체 > 인스턴스 |
[Java] void
반환 타입으로 void를 명시해주면, 자바컴파일러는 암묵적으로 void함수에 return ;
을 넣어준다.
[Java] Primitive Type vs Wrapper Class
ex)
- int vs Interger
- boolean vs Boolean
- long vs Long
- ...
Primitive Type | Wrapper Class |
---|---|
메모리에 곧바로 값이 저장된다. | 원시타입을 객체로 구현한 것으로서 저장 시, 객체의 참조위치가 저장된다. |
- Boxing : Primitive Type -> Wrapper Class
- Unboxing : Wrapper Class -> Primitive Class
- JDK 1.5부터는 auto boxing/unboxing 을 지원하게 되어 명시적으로 형변환을 해줄 필요가 없어짐.
[Java] 매개변수(parameter) vs 인자(argument)
// 매개변수
public class Phone{
Phone(int a, String b, boolean c){ // <= 이렇게 받아올 변수들을 정의하는 것을 매개변수
...
}
}
// 인자
Phone phone = new Phone(1, "갤럭시", true) // <= 이렇게 전달하는 것을 인자
[Java] 원시형 매개변수 vs 참조형 매개변수
원시형 매개변수 | 참조형 매개변수 |
---|---|
Read 가능 | Create, Read, Update, Delete 가능 |
인자로 전달한 것과 별개로 동작한다. | 인자로 전달한 것의 주소를 참조하여, 전달받은 인자에 영향을 준다. |
[Java] 객체 변수 종류
객체의 변수에는 멤버변수와 지역변수가 있다.
그 중에서도 멤버변수는 클래스변수와 인스턴스변수로 분리된다.
class Phone{
// 멤버변수 시작
static int phoneNumber; //1. 클래스 변수
String name; //2. 인스턴스 변수
// 멤버변수 끝
public void getPhone(){
int phoneDetailName; //3. 지역변수
}
}
1. 클래스 변수
- `static`키워드로 선언 된 변수로서, 클래스 메모리에 올라가게 된다.
- 메모리 저장 시점은 단 1회로서, 컴파일러는 클래스 변수를 가장먼저읽어, 클래스 메모리로 이동시킨다.
- 이 때 클래스 변수는 생성자를 이용한 선언없이 사용이 가능하다.
```java
Phone.phoneNumber
```
2. 인스턴스 변수
- new 키워드를 통해 **인스턴스가 생성된 시점**에 힙메모리에 올라간다.
- 이곳에 주소값을 두고, 콜스택에 이 주소값을 쌓아서 사용한다.
3. 지역 변수
- 메소드 내에서만 사용 할 수 있는 변수이다.
- 각 메소드의 런타임 즉, 스택에서 invoke가 시작 될 때 유효해진다.
[Java] 객체 메소드 종류
객체의 메소드는 클래스 메소드와 인스턴스 메소드가 있다.
1. 클래스 메소드
static 키워드로 선언된 메소드로서, 인스턴스 변수나 인스턴스 메소드를 사용하지 않는 것을 클래스 메소드라고 한다.
따라서, 클래스 메소드안에서 인스턴스 변수를 사용할 수 없다. 왜냐하면, 클래스 메소드가 사용가능한 시점은 인스턴스가 생성되지 않은 시점이기 때문이다.
2. 인스턴스 메소드
인스턴스 변수를 필요로 하는 메소드. 인스턴스 생성 된 후이기 때문에 인스턴스 변수와 클래스 변수를 모두 사용 할 수 있다.
[Java] 인터페이스 vs 추상클래스
- 추상 클래스는 부모의 기능을 확장할 때 사용한다. 주로, 상속관계가 확정적일 때 주로 사용. 수직적 확장. (템플릿 메소드 패턴 검색)
- 인터페이스는 객체들에 대한 동일한 동작을 보장하기 위해 사용한다.
[Java] 객체지향의 3가지 특성과 구현예시
1. 캡슐화
- 객체가 어떻게 동작하는지 외부에 노출을 막는다.
- 객체내부의 기능이 변경되도, 외부에는 큰 영향을 끼치지않는다.
- 접근제어자를 통해 구현한다.
2. 추상화
- 어떤 사물의 특성에서 공통적인 특성/성질을 뽑아 의미있는 표현으로 정의한다.
- 예를 들어, 카카오톡, 메시지, 메일에는 '전송'이라는 동일동작이 있다. 하지만, 각기 전송을 하기 위한 조건이 다르다. 따라서, 추상적 명세로 '전송'이라는 동작을 인터페이스에 정의해놓고, 그것을 클래스에서 실행하되 오버라이딩을 통해 자신의 특성에 맞게 정의하여 실행 시킬 수 있다.
- 어떤 특정한 변경없이, '전송'이라는 하나의 동작 키워드로 카카오톡, 메시지, 메일모두에게 명령을 내릴 수 있도록 한다. 즉, kakaoSend/MessageSend/EmailSend 에 대한 메소드구현없이 Send라는 메소드를 갖고와서 자신의 특성에 맞게 사용할 수 있는 것 이다.
- 인터페이스/추상클래스를 통해 구현한다.
3. 다형성
- 특별한 비용없이, 다양한 타입을 갖는것이 가능해지는 특성이다.
- 업캐스팅과 오버라이딩을 통해 구현이 가능하다.
- 업캐스팅이란 부모 클래스로 형변환을 하여 자식클래스를 선언하는 것.
public class Plug {
public void on() { System.out.println("Plug on");}
public void off() {}
}
public interface InternetOfThings {
String status();
}
public class SmartPlug extends Plug implements InternetOfThings {
@Override
.....
public String status() {
...
}
}
public class Smart냉장고 extends Plug implements InternetOfThings {
@Override
.....
public String status() {
...
}
}
SmartPlug smartPlug = new SmartPlug();
smartPlug.on();
smartPlug.off();
Plug plug = smartPlug;
plug.on();
plug.stop();
InternetOfThings iot = smartPlug;
iot = smart냉장고;
//........
// ......
// ...
iot = smartPlug;
iot = smart냉장고;
// 비즈니스 로직
....
iot.status(); // 냉장고
....
위 코드에서 iot는 스마트냉장고, 스마트플러그등 다향한 상태를 받아올 수 있다. 한개의 변수가 다양한 변수타입을 가질 수 있는 것을 다형성이라고하고, 이는 상속,실행을 업캐스팅함으로서 구현 할 수 있다.
[Java] 초기화 블럭
1. 클래스 초기화 블럭
static
키워드로 정의하는 초기화 블럭으로서, 클래스가 생성되는 시점을 볼 수 있다. 클래스 변수를 초기화 할 때 사용한다.
2. 인스턴스 초기화 블럭
인스턴스가 생성되기 직전에 사용되는 초기화 블럭으로서, 클래스 변수와 인스턴스 변수 모두에 접근가능하다.
[Java] 멤버변수의 초기화 시기와 순서
(클래스 별로 1회만 실행됨) 클래스 로딩 -> 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭 -> (인스턴스 생성마다 반복됨) 인스턴스 생성 -> 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자
아래는 2개의 인스턴스를 생성하고, 어떤 순서로 시행되는 지 로그를 찍어본 것이다. 클래스 초기화는 단 1회만 시행되고, 인스턴스 생성마다 초기화가 진행되는 모습을 확인 할 수 있었다.
[회고] 221117
오늘부터 자바의 꽃인 객체지향을 학습하게 된다. 일단, 실제 사례를 통해 어떤식으로 객체지향개념이 적용되는지 명확히 볼 수 있었다. 몇년간 암기식으로만 외우던 것을 실제 사례를 보면서하니, 확 와닿았고, 너무 재미있었다.
오늘은 몸이 좋지 않았다. 코감기가 심하게 오는지 어지럽고 피곤한 상태가 지속되었다. 계속 꾸벅꾸벅졸다가 이건 아닌 것 같아서 병원에 다녀왔는데 몸이 금방나아져서 공부에 집중 할 수 있었다. 갈까 말까 고민했는데, 결론적으로 이런 상황에서 팀의 분위기를 저해하지 않기 위해서는 내 몸상태에 대해서 빠르게 파악하고 대처하는 것도 능력이겠다 생각했다. 내가 조는걸 보고 다른 팀원 분들도 괜시리 집중을 못하는 것 같아 죄송했다. 다녀와서 공부가 잘되니, 팀원들이랑 소통도하고, 질문도 주고받았다. 내가 활발해지니, 팀의 분위기가 조금은 올라가는 것처럼 느껴져 기분이 좋았다. 모난 행동을 하는 것은 아주 사소한 것도 팀이 나가는 방향에 방해가 될 수 있다는 자각을 항상 해야겠다.
오늘 하루종일 자바의 정석을 보면서, 자바학습을 했다. 객체지향프로그래밍I 을 보며 공부했는데, 내가 자바스크립트 공부할 때 어렵다고 간과했던 메모리 동작부가 나왔다. 과거에 이걸 간과하고 개발한 것이 너무 마음에 걸려서, 새로운 언어를 배움에 따라 엔진동작부터 천천히 시작하고자 했다. 생각보다 어렵게 다가오지 않았다. 또한 각 영역에 대한 이해를 하고나니, 지루하게 읽히던 책이 재미있게 다가왔다.
다만, 확실하게 이해했다고 생각했지만, 동작순서에 대한 질문이 들어왔을땐 등땀이 주르륵 흐르면서 입밖으로 내뱉질 못했다. 이것또한 모르는것이기 때문에, 자신감있게 입밖으로 개념을 뱉을 수 있도록 곱씹어야겠다는 다짐을 했다.