
플레이데이터 백엔드 9기 정승원님의 3주차 회고
플레이데이터 풀스택 백엔드 9기 3주차 학습 기록
클래스 란
서로 다른 타입의 데이터와 메소드를 정의하여 사용자 정의의 타입을 만들 수 있는 데 이때 이 과정을 클래스라고 한다.
한 마디로 정리를 하자면 클래스는 사용자정의의 자료형이다. 라고 말할 수 있다. 나는 이 말이 쉽게 와 닿지 않아서 내가 해석한 바로는 클래스는 개발을 할 수 있는 틀을 제공해주는 공간을 선언해주는 것이라고 생각을 한다. 내가 개발을 하고자 하는 의도에 맞는 이름을 지어주는 것. 이게 클래스라고 생각한다.

캡슐화
캡슐화는 유지보수성 증가를 위해 필드의 직접 접근을 제한하고 public 메소드를 이용하여 간접적으로 사용할 수 있도록 클래스를 작성하는 기법으로 기본적으로 캡슐화를 하는 것이 원칙으로 사용되고 있다.
캡슐화에는 4 가지 타입이 있고 그 해당 타입들의 특성은 밑의 사진처럼 구성되어 있다.

추상화
추상화는 유연성을 확보하기 위해 공통적인 것을 추출하고 공통적이지 않은 것을 제거하는 것을 의미한다. 추상화 과정을 통해 객체가 도출이 되면 이 객체를 생성하기 위해 클래스를 설계 하게 된다. 즉 추상화는 현실 세계의 복잡한 사건을 단순화하여 새로운 객체 지향 세계를 창조 해 나가는 과정이다. 이것도 말이 살짝쿵 어려운 데 클래스를 만든 다음에 어떤 역할을 할 지 설계하는 과정에서 해당 클래스에 맞는 단어들을 사용하면서 해당 클래스의 완성도를 높이는 작업이라고 생각한다.
객체 지향 프로그래밍
객체 지향 프로그래밍이란 현실 세계의 모든 사건은 객체와 객체 간의 상호작용에 의해 일어난다는 세계관을 프로그램을 만들 때 이용하는 새로운 세계를 창조하는 방법론이다. 이때 보내는 쪽은 송신자 받는 쪽은 수신자라고 하며 수신자는 메세지를 받아 그 메세지의 내용을 처리하는 방법을 스스로 결정하게 된다.
스스로 결정하는 방식대로 명령어를 순차적으로 기술 한 것을 메소드(method)라고 한다. 객체 지향 프로그래밍에서 중요한 것은 이러한 상호작용을 설계하는 것으로 필드보다는 메소드를 중점으로 추상화 기법을 적용하여 객체를 설계해주는 것이 중요하다. 주의사항으로 한 가지 객체에 너무 여러가지 기능을 넣는 것보다는 한 가지만 집중적으로 사용할 수 있도록 하는 것이 원활한 상호작용을 만들어준다. 이것을 '단일 책임의 원칙'이라고 한다.
오버로딩
오버로딩이란 동일한 클래스 내에는 동일한 이름의 생성자 혹은 메소드를 작성하지 못하는 데 이때 매개변수의 타입, 갯수, 순서를 다르게 작성하면 서로 다른 생성자나 메소드로 인식하기 때문에 동일한 이름의 생성자 나 메소드를 여러 개 작성할 수 있게 해준다. 이 행위를 오버로딩(overloading)이라고 한다.

매개 변수로 사용 가능한 자료형으로는 기본자료형, 기본자료형 배열, 클래스 자료형, 클래스 자료형 배열, 가변인자
이렇게 5가지 형태의 매개변수 사용이 가능하다.
static 과 final 키워드
static 키워드는 정적메모리 영역에 프로그램이 시작될 시 할당 하고자 할 때 사용하는 키워드이다. static 필드나 메소드는 인스턴스 생성없이 클래스 명을 통해 접근해서 사용이 가능하게 해준다. 사용방법은 여러 인스턴스가 공유해서 사용할 목적인 속성이나 필드의 예약어 자리에 추가해주는 방법으로 사용한다. 이때 인스턴스는 클래스에서 사용하는 객체들 즉 클래스가 빵틀이라고 하면 인스턴스는 해당 빵틀에 만들어 질 빵이라고 생각하면 된다.
final 키워드는 변경 불가의 의미를 담고 있는 키워드이다.
(상속과 관련하여 클래스나 메소드의 예약어 자리에 쓰이면 더 이상 하위 클래스에서 가지지 못하는 마지막 클래스나 메소드를 뜻한다.) 라고 한다.
쉽게 말하자면 ~~.최종본 느낌이다. 제출을 하면 변경이 불가하다는 것이 유사한 것 같다.
final 변수는 선언과 동시에 초기화를 하거나 생성자를 통해 초기화를 해줘야 사용이 가능해진다.
변수의 종류
클래스에서 쓰이는 변수는 총 3가지로 클래스 변수, 인스턴스 변수, 지역변수로 구분된다.
클래스 변수는 static 키워드를 가지고 필드에 선언하는 변수로 메모리의 static 영역을 사용한다.
인스턴스 변수는 static 키워드 없이 클래스의 필드에 선언하는 변수로 메모리의 heap 영역을 사용한다.
지역 변수는 메소드, 생성자, 초기화 블록 내부에서 선언하는 변수로 다른 변수들보다 우선권을 가진다.

초기화 블럭
초기화 블럭은 해당 클래스의 인스턴스 생성 시 어떤 생성자를 활용해서 인스턴스를 생성하더라도 공통적으로 실행 될 코드를 작성 할 수 있는 블럭이다.
클래스 필드의 초기화만은 담당하는 중괄호로 둘러 쌓인 블럭을 뜻하며 생성자보다 먼저 호출되며 static 키워드의 유무에 인스턴스 초기화 블럭, 클래스 초기화 블럭으로 구분 할 수 있다.
static 키워드가 있는 것이 클래스 초기화 블럭
static 키워드가 없는 것이 인스턴스 초기화 블럭
객체 배열
객체배열이란 래퍼런스 변수에 대한 배열로 동일한 타입의 여러 인스턴스들을 배열로
관리 할 수 있게 해주는 것으로 배열의 번호에 각 각 객체들을 집어 넣어 사용 할 수 있게 해준다.
객체 배열 과제 풀이


상속
상속은 부모클래스가 가지는 멤버(필드, 메소드)를 자식 클래스가 물려 받아 자신의 멤버 인 것 처럼 사용 할 수 있도록 만드는 기술이다.
이떄 생성자는 물려 받지 않는다. 멤버 외에도 부모 클래스의 타입 또한 상속이 된다. 이 특징이 다형성을 해주게 하는 토대가 된다.
자바는 단일상속(자식 클래스는 하나의 부모 클래스만 가지는)만 지원한다.

상속의 키워드
IS-A
IS-A는 Circle is a Shape 라는 단어에서 가운데 두 문자에서 따온 것으로 자식 클래스는 하나의 부모클래스이다.
라는 말로 성립관계를 뜻하며 클래스 간 상속 관계를 파악하기 위한 키워드이다.
super, spuer()
인스턴스 생성 시 부모 생성자를 호출하여 부모 클래스의 인스턴스도 함께 생성하게 되는 데, 이때 생성한 부모 인스턴스의 주소를 보관하는 레퍼런스 변수로 자식 클래스 내의 모든 생성자와 메소드 내에서 묵시적으로 사용할 수 있는 래퍼런스 변수이다. super()는 부모생성자를 호출하는 구문으로 인자와 매개변수의 타입,갯수,순서가 일치하는 부모의 생성자를 호출하게 된다.
상속 구문에서 '이떄 생성자는 물려 받지 않는다.' 라는 구문이 있는 데 super()를 사용하면 생성자를 호출하여 사용 할 수 있게 해준다.
오버라이딩
부모클래스에서 상속받은 메소드를 자식 클래스가 재정의 하여 사용하기 위한 기술
오버라이딩의 성립조건
1. 메소드명 동일
2. 메소드 리턴타입 통일
3. 매개변수의 타입, 갯수, 순서가 동일
4. 부모 클래스의 private 메소드는 오버라이딩이 안된다.
5. 부모 클래스의 final 키워드가 사용된 메소드는 오버라이딩이 안된다.
6.접근 제어자는 부모 메소드와 같거나 더 넓은 범위여야 한다.
7.예외처리는 같은 예외이거나 더 구체적(하위)인 예외를 처리해야 한다.
오버라이딩 과 오버 로딩의 차이점

다형성
하나의 인스턴스가 여러 가지 타입을 가질 수 있는 것을 의미하며 하나의 타입으로 여러 타입의 인스턴스를 처리 할 수 있고, 하나의 메소드 호출로 객체별로 각기다른 방법으로 동작 할 수 있게 해준다. 다형성은 객체 지향 프로그램ㅇ의 3대 특징(캡슐화, 상속, 다형성) 중 하나이며 객체지향 프로그래밍의 꽃이라고 불리며 활용성이 많고 장점이 많다.
다형성의 장점
1. 여러 타입의 객체를 하나의 타입으로 관리할 수 있기 때문에 유지보수성과 생산성이 증가된다.
2. 상속을 기반으로 한 기술이기 때문에 상속관계에 있는 모든 객체는 동일한 메세지를 수신할 수 있다. 이런 동일한 메세지를 수신받아 처리하는 내용을 객체별로 다르게 할 수 있다는 장점을 가지고 있다. (다양한 기능을 사용하는데 있어서 관리해야 하는 메세지 종류가 줄어들게 된다.)
3. 확장성이 좋은 코드를 작성할 수 있다.
4. 결합도를 낮춰서 유지보수성을 증가시킬 수 있다.
동적바인딩
컴파일 당시에는 해당 타입의 메소드와 연결되어 있다가 런타임 시 실제 인스턴스가 메소드(오버라이딩 한 메소드)로 바인딩이 바뀌어 동작하는 것을 의미한다.

Instanceof 연산자
클래스 형변환의 경우 런타임시 존재하는 타입과 형변환하려는 타입이 일치하지 않는 경우 ClassCastException이 발생한다.
그렇기에 조금 더 런타임 시 안전한 형변환을 하기 위해 instanceof 연산자를 이용할 수 있다.
instanceof 연산자는 레퍼런스 변수가 실제로 어떤 클래스 타입의 인스턴스인지 확인하여 true or false를 반환한다.
사용 양식은
If ( 래퍼런스 변수 instanceof 클래스 타입){
실행 내용~
} 형태로 사용한다.
추상클래스
추상 메소드(메소드의 기능이 없고 메소드의 헤더부만 존재하는 불완전한 메소드)를 0개 이상 포함하는 클래스로 스스로 자신의 생성자를 활용한 인스턴스 생성이 불가능하다. 따라서 추상 클래스는 불완전한 클래스라고 볼 수 있다. 추상 클래스는 상속을 활용해 하위 클래스 타입의 인스턴스를 이용해서 인스턴스를 생성해야 한다. 추상 메소드를 하나라도 포함하면 불완전하다고 볼 수 있는 클래스이므로 반드시 추상 클래스가 되어야 한다.
추상클래스는 스스로 인스턴스는 만들지 못하지만 다형성 적용을 위한 부모타입의 역할을 할 수 있어 상속을 활용해 하위 클래스 타입의 인스턴스를 이용해서 인스턴스를 생성해야 한다. 추상 메소드를 하나라도 포함하면 불완전하다고 볼 수 있는 클래스이므로 반드시 추상클래스가 되어야한다.이렇게 정의하면 뜬 구름 잡는 느낌이라서 강사님한테 여쭤보니 이것을 현장에서 적용을 하면 본인이 막히는 부분을 다른 작업자에게 해결 해 달라고 첨삭을 보낼 때 사용된다고 한다.
인터페이스
추상 메소드와 상수 필드만 가질 수 있는 클래스의 변형체로 상속과 달리 implements라는 키워드를 사용하며 자식 클래스 입장에서 ‘상속 받았다’고 말하지 않고 ‘구현한다’라는 표현을 쓴다. 인터페이스를 구현하기 위해서는 implements 키워드를 사용해야 한다. 자바에서는 단일 상속이라는 단점이 있어 이 단점을 극복하기 위해 인터페이스를 사용하여 여러 개의 클래스를 사용 할 수 있게 해준다.

추상 클래스와 인터페이스의 공통점과 차이점

Object
Object는 자바에서 최상위 부모 클래스로 다양한 메소드로 구성되어 있다. 모든 클래스는 Object 클래스를 상속하고 있으므로 Object 안에 있는 메소드를 사용 할 수 있게 된다. 또한 Object 클래스가 가지고 있는 메소드를 오버라이딩(부모클래스에서 상속받은 메소드를 자식 클래스가 재정의해서 사용하는 것) 해서 사용하는 것도 가능하다.
toString()
- toString() 메소드는 인스턴스의 정보를 문자열로 반환한다.
- 반환되는 문자열은 클래스 이름과 구분자 ‘@’를 사용하며, 그 뒤로 16진수 해시코드가 붙게된다. (해시코드는 인스턴스 주소)
예) 클래스명@16진수해시코드 - toString 메서드를 사용할 때 해시코드가 아닌 인스턴스 안에 값을 확인하고 싶다면 오버라이딩(재정의)를 하면 된다.
equals()
- equals 메소드는 매개변수로 전달받은 인스턴스와 == 연산해서 true, false 로 반환한다. 즉, 동일한 인스턴스인지를 비교하는 기능이다.
- 동일 객체와 동등 객체
- 동일 객체 : 주소가 동일한 인스턴스를 동일 객체라고 한다
- 동등 객체 : 주소는 다르더라도 필드값이 동일한 객체를 동등 객체라고 한다.
- 경우에 따라서는 동등객체를 동일 객체로 취급해서 비교하고 싶은 경우가 발생한다. 즉, 동일한 필드값을 가지는 객체를 같은 객체로 판단할 수 있도록 하는 경우를 말한다. 그러한 경우 equals() 메소드를 오버라이딩하여, 각각의 필드가 동일한 값을 가지는지를 확인하고 모든 필드값이 같은 값을 가지는 경우 true, 아닌 경우 false를 반환하도록 작성한다.
hashCode()
- 해시코드는 객체를 식별하는 값이다. Object의 hashCode() 메소드는 객체의 메모리 주소값을 이용해 해시코드를 만들어서 반환한다.
- Object 클래스의 명세에 작성된 일반 규약에 따르면 equals() 메소드를 재정의 하는 경우 반드시 hashCode() 메소드도 재정의 하도록 되어 있다.
- 만약 hashCode()를 재정의 하지 않으면 같은 값을 가지는 동등 객체는 같은 해시코드 값을 가져야 한다는 규약에 위반되게 된다.
(강제성은 없지만 규약대로 작성하는 것이 좋다)
String
자바에서 String 클래스는 문자열을 나타내는 자료형으로 문자열 관련된 작업을 할 때 유용하게 사용 할 수 있는 다양한 메소드가 포함되어 있다.
String 인스턴스는 한번 생성되면 그 값을 읽기만 가능하고 변경할 수 는 없게 된다. 이러한 객체를 (immutable object)라고 한다.
그리고 String의 가족인 StringBuilder 와 StringBuffer가 있다. 이 2가지가 왜 있냐면 String은 불변의 존재로 값을 변경하고자 하여 Builder와 Buffer 가 생기게 되었다. 이 2가지 또한 차이점이 있는 데 StringBuilder의 경우 Thread Safe가 가능하지만 StringBuffer는 불가능하여 '멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋습니다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인헤StringBuilder에 비해 성능이 좋지 않습니다.'라는 특징이 있다.
출처: https://12bme.tistory.com/42 [길은 가면, 뒤에 있다.:티스토리]
Wrapper
Wrapper 클래스는 기본 타입의 데이터를 인스턴스화 해야 되는 경우 사용하게 된다.
특정 메소드가 매개변수로 객체 타입만 요구하게 되면 기본 타입의 데이터를 먼저 인스턴스로 변환 후 넘겨줘야 하는 데 이때 8가지에 해당하는 기본 타입의 데이터를 인스턴스화 할 수 있도록 해주는 클래스를 Wrapeer 클래스라고 한다.

이 Wrapper클래스를 이용해서 인스턴스화 하는 것을 Boxing이라고 한다. 인스턴스 화가 된 것을 되돌리는 것을 UnBoxing이라고 한다.

그 뒤에 Time 패키지도 있는 데 이것의 경우 필요에 의해 자신이 찾아서 사용하면 될 것 같아 기입하지 않았다.
중요성이 앞의 내용들 보다 현저히 낮다고 판단을 하였다.
일주일 진행 간에 있어 느낀 점
이번 주는 너무 많은 양을 뇌에 때려박은 것 같다.. 머리가 얼얼하다..
그래도 수업 시간에 강사님이 주시는 과제를 풀려고 고뇌하고 끙끙대다가 풀었을 때 너무 재미있다.
중요한 내용이 이번에 너무 많아서 한번 더 복습을 따로 해봐야 겠다.
✔ 좋았거나 내가 잘한 점
일단 뭐든 지 첫 시도하는 거에 대한 거부감이 있었는 데 PCCE 시험 지원 한 것과 자격증 또한 이번에 제대로 공부해보자 해서 스터티 신청 한 것은 잘한 것 같다. 자격증 시험의 경우 필기 공부의 방향성을 아직도 못 잡고 있어 어떻게 해야 될 지 모르겠다. 스터디를 해 가면서 주변 분들에게 여쭤봐야 겠다.
✔ 아쉬웠던 점
평일 수업 마치고 자습 간에 정보처리산업기사 필기 공부를 따로 하거나 개념 정리 좀 할려고 하는 데 주말에 못한 과제를 평일에 계속해서 하게 된다.
지금은 거의 다 끝낸 상태인데 다음 주 예비군을 가면 또 어떻게 될 지..
✔ 개선할 점
3주차 동안 진행하면서 계속해서 주말을 그냥 회고록 작성 하고 과제하는 용도로 사용만 하고 있는 것 같다.. 따로 내 공부를 해야 될 것 같은 데 평일의 피로가 몰려와서 주말에 잠을 많이 자게 된다. 수면시간 규칙적으로 가져야 될 것 같은데 주말에 무슨 막~ 9~10시간을 자버리니.. 너무 아깝다.
✔ 다음주 계획
4월 8일~10일 까지 동원 예비군이 있으니 예비군부터 별 탈없이 해결하고 PCCE 대비 손코딩 한번 싹 하면서 정보처리산업기사 필기공부법을 고려해봐야겠다.
원래 자격증 공부를 엄청 여유를 갖고 시작을 하는 데 원서접수부터 시작해서 시험까지 대략 한달 정도 남아서 공부법을 주변 분들한테 여쭤봐서 다양한 정보를 듣고 내 입맛에 맞게 공부해봐야 겠다. 예비군을 가는 3일의 공백이 조금.. 두렵긴 한데.. 예비군은 빨리 해결하는 게 마음 편하고 나중에 지장이 안 갈 갈 것 같다. 좀 고생하지 뭐
승원님의 더 많은 이야기가 궁금하다면?
👉 플레이데이터 백엔드 9기 정승원님의 블로그에서 확인해보세요!🚀[ 블로그 바로가기 ]
클래스 란
서로 다른 타입의 데이터와 메소드를 정의하여 사용자 정의의 타입을 만들 수 있는 데 이때 이 과정을 클래스라고 한다.
한 마디로 정리를 하자면 클래스는 사용자정의의 자료형이다. 라고 말할 수 있다. 나는 이 말이 쉽게 와 닿지 않아서 내가 해석한 바로는 클래스는 개발을 할 수 있는 틀을 제공해주는 공간을 선언해주는 것이라고 생각을 한다. 내가 개발을 하고자 하는 의도에 맞는 이름을 지어주는 것. 이게 클래스라고 생각한다.
캡슐화
캡슐화는 유지보수성 증가를 위해 필드의 직접 접근을 제한하고 public 메소드를 이용하여 간접적으로 사용할 수 있도록 클래스를 작성하는 기법으로 기본적으로 캡슐화를 하는 것이 원칙으로 사용되고 있다.
캡슐화에는 4 가지 타입이 있고 그 해당 타입들의 특성은 밑의 사진처럼 구성되어 있다.
추상화
추상화는 유연성을 확보하기 위해 공통적인 것을 추출하고 공통적이지 않은 것을 제거하는 것을 의미한다. 추상화 과정을 통해 객체가 도출이 되면 이 객체를 생성하기 위해 클래스를 설계 하게 된다. 즉 추상화는 현실 세계의 복잡한 사건을 단순화하여 새로운 객체 지향 세계를 창조 해 나가는 과정이다. 이것도 말이 살짝쿵 어려운 데 클래스를 만든 다음에 어떤 역할을 할 지 설계하는 과정에서 해당 클래스에 맞는 단어들을 사용하면서 해당 클래스의 완성도를 높이는 작업이라고 생각한다.
객체 지향 프로그래밍
객체 지향 프로그래밍이란 현실 세계의 모든 사건은 객체와 객체 간의 상호작용에 의해 일어난다는 세계관을 프로그램을 만들 때 이용하는 새로운 세계를 창조하는 방법론이다. 이때 보내는 쪽은 송신자 받는 쪽은 수신자라고 하며 수신자는 메세지를 받아 그 메세지의 내용을 처리하는 방법을 스스로 결정하게 된다.
스스로 결정하는 방식대로 명령어를 순차적으로 기술 한 것을 메소드(method)라고 한다. 객체 지향 프로그래밍에서 중요한 것은 이러한 상호작용을 설계하는 것으로 필드보다는 메소드를 중점으로 추상화 기법을 적용하여 객체를 설계해주는 것이 중요하다. 주의사항으로 한 가지 객체에 너무 여러가지 기능을 넣는 것보다는 한 가지만 집중적으로 사용할 수 있도록 하는 것이 원활한 상호작용을 만들어준다. 이것을 '단일 책임의 원칙'이라고 한다.
오버로딩
오버로딩이란 동일한 클래스 내에는 동일한 이름의 생성자 혹은 메소드를 작성하지 못하는 데 이때 매개변수의 타입, 갯수, 순서를 다르게 작성하면 서로 다른 생성자나 메소드로 인식하기 때문에 동일한 이름의 생성자 나 메소드를 여러 개 작성할 수 있게 해준다. 이 행위를 오버로딩(overloading)이라고 한다.
매개 변수로 사용 가능한 자료형으로는 기본자료형, 기본자료형 배열, 클래스 자료형, 클래스 자료형 배열, 가변인자


이렇게 5가지 형태의 매개변수 사용이 가능하다.
static 과 final 키워드
static 키워드는 정적메모리 영역에 프로그램이 시작될 시 할당 하고자 할 때 사용하는 키워드이다. static 필드나 메소드는 인스턴스 생성없이 클래스 명을 통해 접근해서 사용이 가능하게 해준다. 사용방법은 여러 인스턴스가 공유해서 사용할 목적인 속성이나 필드의 예약어 자리에 추가해주는 방법으로 사용한다. 이때 인스턴스는 클래스에서 사용하는 객체들 즉 클래스가 빵틀이라고 하면 인스턴스는 해당 빵틀에 만들어 질 빵이라고 생각하면 된다.
final 키워드는 변경 불가의 의미를 담고 있는 키워드이다.
(상속과 관련하여 클래스나 메소드의 예약어 자리에 쓰이면 더 이상 하위 클래스에서 가지지 못하는 마지막 클래스나 메소드를 뜻한다.) 라고 한다.
쉽게 말하자면 ~~.최종본 느낌이다. 제출을 하면 변경이 불가하다는 것이 유사한 것 같다.
final 변수는 선언과 동시에 초기화를 하거나 생성자를 통해 초기화를 해줘야 사용이 가능해진다.
변수의 종류
클래스에서 쓰이는 변수는 총 3가지로 클래스 변수, 인스턴스 변수, 지역변수로 구분된다.
클래스 변수는 static 키워드를 가지고 필드에 선언하는 변수로 메모리의 static 영역을 사용한다.
인스턴스 변수는 static 키워드 없이 클래스의 필드에 선언하는 변수로 메모리의 heap 영역을 사용한다.
지역 변수는 메소드, 생성자, 초기화 블록 내부에서 선언하는 변수로 다른 변수들보다 우선권을 가진다.
초기화 블럭
초기화 블럭은 해당 클래스의 인스턴스 생성 시 어떤 생성자를 활용해서 인스턴스를 생성하더라도 공통적으로 실행 될 코드를 작성 할 수 있는 블럭이다.
클래스 필드의 초기화만은 담당하는 중괄호로 둘러 쌓인 블럭을 뜻하며 생성자보다 먼저 호출되며 static 키워드의 유무에 인스턴스 초기화 블럭, 클래스 초기화 블럭으로 구분 할 수 있다.
static 키워드가 있는 것이 클래스 초기화 블럭
static 키워드가 없는 것이 인스턴스 초기화 블럭
객체 배열
객체배열이란 래퍼런스 변수에 대한 배열로 동일한 타입의 여러 인스턴스들을 배열로
관리 할 수 있게 해주는 것으로 배열의 번호에 각 각 객체들을 집어 넣어 사용 할 수 있게 해준다.
객체 배열 과제 풀이
상속
상속은 부모클래스가 가지는 멤버(필드, 메소드)를 자식 클래스가 물려 받아 자신의 멤버 인 것 처럼 사용 할 수 있도록 만드는 기술이다.
이떄 생성자는 물려 받지 않는다. 멤버 외에도 부모 클래스의 타입 또한 상속이 된다. 이 특징이 다형성을 해주게 하는 토대가 된다.
자바는 단일상속(자식 클래스는 하나의 부모 클래스만 가지는)만 지원한다.
상속의 키워드
IS-A
IS-A는 Circle is a Shape 라는 단어에서 가운데 두 문자에서 따온 것으로 자식 클래스는 하나의 부모클래스이다.
라는 말로 성립관계를 뜻하며 클래스 간 상속 관계를 파악하기 위한 키워드이다.
super, spuer()
인스턴스 생성 시 부모 생성자를 호출하여 부모 클래스의 인스턴스도 함께 생성하게 되는 데, 이때 생성한 부모 인스턴스의 주소를 보관하는 레퍼런스 변수로 자식 클래스 내의 모든 생성자와 메소드 내에서 묵시적으로 사용할 수 있는 래퍼런스 변수이다. super()는 부모생성자를 호출하는 구문으로 인자와 매개변수의 타입,갯수,순서가 일치하는 부모의 생성자를 호출하게 된다.
상속 구문에서 '이떄 생성자는 물려 받지 않는다.' 라는 구문이 있는 데 super()를 사용하면 생성자를 호출하여 사용 할 수 있게 해준다.
오버라이딩
부모클래스에서 상속받은 메소드를 자식 클래스가 재정의 하여 사용하기 위한 기술
오버라이딩의 성립조건
1. 메소드명 동일
2. 메소드 리턴타입 통일
3. 매개변수의 타입, 갯수, 순서가 동일
4. 부모 클래스의 private 메소드는 오버라이딩이 안된다.
5. 부모 클래스의 final 키워드가 사용된 메소드는 오버라이딩이 안된다.
6.접근 제어자는 부모 메소드와 같거나 더 넓은 범위여야 한다.
7.예외처리는 같은 예외이거나 더 구체적(하위)인 예외를 처리해야 한다.
오버라이딩 과 오버 로딩의 차이점
다형성
하나의 인스턴스가 여러 가지 타입을 가질 수 있는 것을 의미하며 하나의 타입으로 여러 타입의 인스턴스를 처리 할 수 있고, 하나의 메소드 호출로 객체별로 각기다른 방법으로 동작 할 수 있게 해준다. 다형성은 객체 지향 프로그램ㅇ의 3대 특징(캡슐화, 상속, 다형성) 중 하나이며 객체지향 프로그래밍의 꽃이라고 불리며 활용성이 많고 장점이 많다.
다형성의 장점
1. 여러 타입의 객체를 하나의 타입으로 관리할 수 있기 때문에 유지보수성과 생산성이 증가된다.
2. 상속을 기반으로 한 기술이기 때문에 상속관계에 있는 모든 객체는 동일한 메세지를 수신할 수 있다. 이런 동일한 메세지를 수신받아 처리하는 내용을 객체별로 다르게 할 수 있다는 장점을 가지고 있다. (다양한 기능을 사용하는데 있어서 관리해야 하는 메세지 종류가 줄어들게 된다.)
3. 확장성이 좋은 코드를 작성할 수 있다.
4. 결합도를 낮춰서 유지보수성을 증가시킬 수 있다.
동적바인딩
컴파일 당시에는 해당 타입의 메소드와 연결되어 있다가 런타임 시 실제 인스턴스가 메소드(오버라이딩 한 메소드)로 바인딩이 바뀌어 동작하는 것을 의미한다.
Instanceof 연산자
클래스 형변환의 경우 런타임시 존재하는 타입과 형변환하려는 타입이 일치하지 않는 경우 ClassCastException이 발생한다.
그렇기에 조금 더 런타임 시 안전한 형변환을 하기 위해 instanceof 연산자를 이용할 수 있다.
instanceof 연산자는 레퍼런스 변수가 실제로 어떤 클래스 타입의 인스턴스인지 확인하여 true or false를 반환한다.
사용 양식은
If ( 래퍼런스 변수 instanceof 클래스 타입){
실행 내용~
} 형태로 사용한다.
추상클래스
추상 메소드(메소드의 기능이 없고 메소드의 헤더부만 존재하는 불완전한 메소드)를 0개 이상 포함하는 클래스로 스스로 자신의 생성자를 활용한 인스턴스 생성이 불가능하다. 따라서 추상 클래스는 불완전한 클래스라고 볼 수 있다. 추상 클래스는 상속을 활용해 하위 클래스 타입의 인스턴스를 이용해서 인스턴스를 생성해야 한다. 추상 메소드를 하나라도 포함하면 불완전하다고 볼 수 있는 클래스이므로 반드시 추상 클래스가 되어야 한다.
추상클래스는 스스로 인스턴스는 만들지 못하지만 다형성 적용을 위한 부모타입의 역할을 할 수 있어 상속을 활용해 하위 클래스 타입의 인스턴스를 이용해서 인스턴스를 생성해야 한다. 추상 메소드를 하나라도 포함하면 불완전하다고 볼 수 있는 클래스이므로 반드시 추상클래스가 되어야한다.이렇게 정의하면 뜬 구름 잡는 느낌이라서 강사님한테 여쭤보니 이것을 현장에서 적용을 하면 본인이 막히는 부분을 다른 작업자에게 해결 해 달라고 첨삭을 보낼 때 사용된다고 한다.
인터페이스
추상 메소드와 상수 필드만 가질 수 있는 클래스의 변형체로 상속과 달리 implements라는 키워드를 사용하며 자식 클래스 입장에서 ‘상속 받았다’고 말하지 않고 ‘구현한다’라는 표현을 쓴다. 인터페이스를 구현하기 위해서는 implements 키워드를 사용해야 한다. 자바에서는 단일 상속이라는 단점이 있어 이 단점을 극복하기 위해 인터페이스를 사용하여 여러 개의 클래스를 사용 할 수 있게 해준다.
추상 클래스와 인터페이스의 공통점과 차이점
Object
Object는 자바에서 최상위 부모 클래스로 다양한 메소드로 구성되어 있다. 모든 클래스는 Object 클래스를 상속하고 있으므로 Object 안에 있는 메소드를 사용 할 수 있게 된다. 또한 Object 클래스가 가지고 있는 메소드를 오버라이딩(부모클래스에서 상속받은 메소드를 자식 클래스가 재정의해서 사용하는 것) 해서 사용하는 것도 가능하다.
toString()
예) 클래스명@16진수해시코드
equals()
hashCode()
(강제성은 없지만 규약대로 작성하는 것이 좋다)
String
자바에서 String 클래스는 문자열을 나타내는 자료형으로 문자열 관련된 작업을 할 때 유용하게 사용 할 수 있는 다양한 메소드가 포함되어 있다.
String 인스턴스는 한번 생성되면 그 값을 읽기만 가능하고 변경할 수 는 없게 된다. 이러한 객체를 (immutable object)라고 한다.
그리고 String의 가족인 StringBuilder 와 StringBuffer가 있다. 이 2가지가 왜 있냐면 String은 불변의 존재로 값을 변경하고자 하여 Builder와 Buffer 가 생기게 되었다. 이 2가지 또한 차이점이 있는 데 StringBuilder의 경우 Thread Safe가 가능하지만 StringBuffer는 불가능하여 '멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋습니다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인헤StringBuilder에 비해 성능이 좋지 않습니다.'라는 특징이 있다.
출처: https://12bme.tistory.com/42 [길은 가면, 뒤에 있다.:티스토리]
Wrapper
Wrapper 클래스는 기본 타입의 데이터를 인스턴스화 해야 되는 경우 사용하게 된다.
특정 메소드가 매개변수로 객체 타입만 요구하게 되면 기본 타입의 데이터를 먼저 인스턴스로 변환 후 넘겨줘야 하는 데 이때 8가지에 해당하는 기본 타입의 데이터를 인스턴스화 할 수 있도록 해주는 클래스를 Wrapeer 클래스라고 한다.
이 Wrapper클래스를 이용해서 인스턴스화 하는 것을 Boxing이라고 한다. 인스턴스 화가 된 것을 되돌리는 것을 UnBoxing이라고 한다.
그 뒤에 Time 패키지도 있는 데 이것의 경우 필요에 의해 자신이 찾아서 사용하면 될 것 같아 기입하지 않았다.
중요성이 앞의 내용들 보다 현저히 낮다고 판단을 하였다.
일주일 진행 간에 있어 느낀 점
이번 주는 너무 많은 양을 뇌에 때려박은 것 같다.. 머리가 얼얼하다..
그래도 수업 시간에 강사님이 주시는 과제를 풀려고 고뇌하고 끙끙대다가 풀었을 때 너무 재미있다.
중요한 내용이 이번에 너무 많아서 한번 더 복습을 따로 해봐야 겠다.
✔ 좋았거나 내가 잘한 점
일단 뭐든 지 첫 시도하는 거에 대한 거부감이 있었는 데 PCCE 시험 지원 한 것과 자격증 또한 이번에 제대로 공부해보자 해서 스터티 신청 한 것은 잘한 것 같다. 자격증 시험의 경우 필기 공부의 방향성을 아직도 못 잡고 있어 어떻게 해야 될 지 모르겠다. 스터디를 해 가면서 주변 분들에게 여쭤봐야 겠다.
✔ 아쉬웠던 점
평일 수업 마치고 자습 간에 정보처리산업기사 필기 공부를 따로 하거나 개념 정리 좀 할려고 하는 데 주말에 못한 과제를 평일에 계속해서 하게 된다.
지금은 거의 다 끝낸 상태인데 다음 주 예비군을 가면 또 어떻게 될 지..
✔ 개선할 점
3주차 동안 진행하면서 계속해서 주말을 그냥 회고록 작성 하고 과제하는 용도로 사용만 하고 있는 것 같다.. 따로 내 공부를 해야 될 것 같은 데 평일의 피로가 몰려와서 주말에 잠을 많이 자게 된다. 수면시간 규칙적으로 가져야 될 것 같은데 주말에 무슨 막~ 9~10시간을 자버리니.. 너무 아깝다.
✔ 다음주 계획
4월 8일~10일 까지 동원 예비군이 있으니 예비군부터 별 탈없이 해결하고 PCCE 대비 손코딩 한번 싹 하면서 정보처리산업기사 필기공부법을 고려해봐야겠다.
원래 자격증 공부를 엄청 여유를 갖고 시작을 하는 데 원서접수부터 시작해서 시험까지 대략 한달 정도 남아서 공부법을 주변 분들한테 여쭤봐서 다양한 정보를 듣고 내 입맛에 맞게 공부해봐야 겠다. 예비군을 가는 3일의 공백이 조금.. 두렵긴 한데.. 예비군은 빨리 해결하는 게 마음 편하고 나중에 지장이 안 갈 갈 것 같다. 좀 고생하지 뭐
승원님의 더 많은 이야기가 궁금하다면?
👉 플레이데이터 백엔드 9기 정승원님의 블로그에서 확인해보세요!🚀[ 블로그 바로가기 ]