서론
3주차 - Class (04/01 ~ 04/07)
자바의 꽃 클래스를 만났습니다. 객체지향이라는 명목하에 캡슐화, 추상화, 상속, 다형성 네 가지 핵심 개념을 배운 한 주였습니다.
그리고, 다른 수강생들의 코드 풀이가 모두 다르다는 것에 재미를 느꼈습니다.
1. 내용정리
배열(Arrays)
- ex)
int arr[] = new int[5]; 최초 선언 시 배열의 반드시 크기는 할당, 인덱스 0부터 시작
- 얇은복사 : 얕은 복사는 stack에 저장되어 있는 배열의 주소값만 복사한다는 것
- 깊은복사 : 깊은 복사는 heap에 생성된 배열이 가지고 있는 값을 또 다른 배열에 복사
- 다차원 배열은 2차원 배열 까지 사용 > 인지 범위의 한계로 더 높은 차원의 배열은 사용 빈도가 극히 적다.
[4대 핵심]
캡슐화(Encapsulation)
- 캡슐화는 유지보수성 증가(낮은 결합도)를 위해 필드의 직접 접근을 제한하고, public 메소드를 이용하여 간접적으로 접근하여 사용
- 필드에 직접 접근하지 못하도록 private 접근 제어자 사용
- 만약 필드에 직접 접근하면 잘못된 값도 들어갈 수 있음
- public 메소드로 간접 접근하여 사용
추상화(Abstraction)
- 유연성을 확보하기 위해 공통적인 것을 추출
- 현실세계의 복잡한 사건을 단순화하여 새로운 객체 지향 세계를 창조해나가는 과정
- 추상 클래스는 extends 키워드를 사용하여 단일 상속, 인터페이스는 implements키워드를 사용하여 구현(다중 구현 가능)
- 추상 메서드는 abstract키워드를 명시적 사용, 인터페이스는 묵시적으로 사용
상속 (Inheritance)
- 자바에서는 단일 상속만을 허용하기 때문에 하나 이상의 클래스로부터 상속
- 부모 클래스의 해당 타입을 가지고 있음 -> 다형성과 연결
- 기존 기능에 추가로 바꿔서 만들 수 있기 때문에 "상속"의 개념보다 "확장"이라고 이해하는 것이 더 직관적
- 한 곳에서 여러개로 파생 수정이 가능해 유지보수성에 용이
- 상속을 남용하면 잘못된 설계가 될 수 있어 책임의 규모는 적절해야 함
- IS-A 관계로 구분되는 경우에만 사용
- super() : 부모 생성자를 호출하는 구문으로 인지와 매개변수 타입, 갯수, 순서가 일치하는 부모의 생성자를 호출
- this() : 현재 객체 자기 자신을 가리킴 (this.name = name;) / 현재 클래스의 다른 생성자를 호출함
다형성 (Polymorphism)
- 하나의 인스턴스가 여러 가지 타입을 가질 수 있는 것을 의미
- 상속관계에 있는 모든 객체는 동일한 메세지를 수신
- 여러 타입의 객체를 하나의 타입으로 관리, 낮은 결홉도로 인한 유지보수성 증가
- 동적바인딩 : 컴파일 당시에는 해당 타입의 메소드와 연결, 런타임 시 오버라이딩 한 메소드로 바인딩이 바뀌어 동작
[Object]
HashCode
- toString() (object클래스가 가지고 있는) : 16진수 해쉬코드가 문자열로 반환
- equals() : equals 메소드는 매개변수로 전달받은 인스턴스와 == 연산해서 true, false 로 반환
- hashCode() : Object 클래스의 명세에 작성된 일반 규약에 따르면 equals() 메소드를 재정의 하는 경우 반드시 hashCode() 메소드도 재정의 하도록 되어 있음.
String 주요 메소드
- charAt() : 해당 문자열의 특정 인덱스 반환
- compareTo() : 인자로 전달된 문자열과 사전 순으로 비교
- concat() : 문자열에 인자로 전달된 문자열 합치기
- indexOf() : 문자열에서 특정 문자를 탐색
- lastIndexOf() : 문자열 탐색을 뒤에서부터 하고 처음 일치하는 위치의 인덱스를 반환(문자열 인덱스)
- trim() : 문자열의 앞 뒤에 공백을 제거한 문자열을 반환
- substring() : 문자열의 일부분을 잘라내어 새로운 문자열 반환
- length() : 문자열의 길이를 정수형으로 반환
- isEmpty() : 문자열의 길이가 0이면 true를 반환, 아니면 false를 반환
- contains() :
- split() : 정규 표현식을 이용하여 문자열 분리
- StringTokenizer : 문자열의 모든 문자를 구부낮로 하여 문자열 분리
스트링빌더(String Builder)
String은 불변의 특성을 가지고 있고, StringBuilder는 가변이라는 특성을 가짐
- capacity() : 현재 버퍼의 크기 / 용량을 초과하게 될 때 자동으로 *2 +2 만큼 크기확장
- append() : 인자로 전달된 값을 문자열로 변환 후 기존 문자열의 마지막에 추가
- delete() : 시작인덱스와 종료 인덱스를 이용해서 문자열에서 원하는 부분의 문자열 제거
- deleteCharAt() : 문자열 인덱스를 이용해 문자 하나 제거
- insert(인덱스, 문자열) : 인자로 전달된 값을 문자열로 변환 후 인덱스 위치 추가
- reverse() : 문자열 인덱스 순번을 역순으로 재배열
문자열 구분자
[예외처리]

- Unchecked Exception 개발자가 판단하여 예외처리
- Checked Exception 반드시 예외처리, 컴파일 에러 발생
RuntimeException
- 해당 타입의 예외는 런타임 시점에 발생
- ArithmeticException : 0으로 나누는 경우 발생
- ArrayIndexOutOfBoundsException : 배열의 index범위를 넘어서 참조하는 경우 발생
- NullPointerException : 인스턴스가 참조되지 않은 상태(Null)로 인스턴스에 접근 경우 발생
- ClassCastException : 형변환(Cast연산자 사용) 시 자료형에 문제가 있을 때 발생
- NegativeArraySizeException : 배열 크기를 음수로 지정한 경우 발생
try / catch (finally)
- try : 예외 발생시 해당 예외 타입 처리 기술하는 블럭
- catch : try 블럭에서 예외 발생 시 해당 예외 타입에 대한 처리하는 블럭
- getMessage(), getClass()로 발생지 확인 가능
- finally : 예외 발생 여부와 관계없이 꼭 실행되어 처리해야 할 코드
throws로 위임
- 상위 메소드에게 처리를 위임하는 방식(상속 받듯이 위임)
throw new를 사용해 강제 예외 발생
[입출력]
- InputStream과 OutputStream : 1바이트 단위로 입/출력
- FileReader와 FileWriter : 2바이트 or 3바이트 단위로 입/출력, 한글을 정상적으로 읽어올 수 있음
- FileOutputStream : 1바이트 단위로 데이터 처리

기반 스트림
- 데이터를 읽고 쓰기 위한 단방향 통로
- 1바이트 단위의 데이터만 지나가게 되고 주고 받는 데이터의 기본 단위
- new FileOutputStream(파일, append) : append가 붙으면 이어쓰기
보조 스트림
- 입출력 처리가 불가능 하고 기반 스트림에 추가로 적용하는 기능
- 입출력 속도 향상 및 한 줄씩 출력 및 입력 관련 메소드 제공 보조 스트림
BufferedInputStream / BufferedOutputStream
- 인코딩 방식을 고려한 한글 깨짐 방지를 위해 고려할 수 있는 보조 스트림-
InputStreamReader / OutputStreamWriter
- 기본자료형 및 문자열 관련 타입에 따른 메소드를 제공하는 보조 스트림
DataInputStream / DataOutputStream
- 객체 단위 입출력을 위한 보조 스트림
ObjectInputStream / ObjectOutputStream
2. 문제 풀이
학생과 직원을 관리하는 프로그램으로 상속 구조를 통해 구현하는 실습 문제로 다이어그램과 가이드라인에 따라 문제를 풀어봤습니다.
그 중 사원의 정보를 키보드로 입력받아 출력하는 코드 부분입니다.

- 문제풀이.
배열을 선언하여 do while문과 for문 중첩을 통해 텍스트 반복적으로 입력 받는 코드를 작성했고, 입력 받은 값을 EmployeeDTO클래스에 있는 PersonDTO의 클래스를 상속받아 오버라이딩된 객체를 호출해 배열에 담아주고, 배열에 저장한 값들을 다시 EmployeeDTO클래스에 있는 객체 'information'을 불러와 출력 해주었고, 중간 중간 출력하며 결과를 보고, if문과 flag 등의 요소들을 넣었습니다.
출력문에서 NullPointerException 에러가 발생해 null값 처리 하는 법을 다시 상기했습니다.
3. 마무리
> 아쉬웠던 점과 좋았던 점
개념 정리와 문제 풀이에 시간 배분이 적당하지 않아 실질적인 코딩에 대한 능력 발달이 약한 부분이 아쉬웠고, 생활에 어느정도 적응하며, 개념 정리 습관이 잡혔습니다.
> 개선할 점
적절한 시간 배분, 과제 완수에 집중하여 개선
> 다음주 계획
저번 주와 마찬가지로 과제 풀이 및 조원과 study 진행