[패스트캠퍼스 백엔드 부트캠프 3기] 2주차 정리
클래스 : 데이터와 명령의 묶음 / 변수와 메서드의 묶음
변수는 data, 메서드는 data를 활용한 연산
클래스는 연관있는 데이터와 명령들을 그룹화 한 것이다.
설계에서 중요한건 그룹을 만들고 그룹간의 관계를 설정하는 것인데, 그룹은 보통 영역(괄호)로 구분이 된다.
영역
1) 클래스 영역 --- 이름 O
2) 메서드 영역 ---이름 O
3) 블럭 영역 --- 이름 X
괄호의 역할 ? 범위를 정해주는 것 , ---왜 ? --- 영역을 구분하여 그룹화 하려고
<블록 영역>
1. if(조건) { } : 0-1번 실행
2. while(조건) { } : 0-n번 실행
* 반복문이 어려운 이유 : 처음부터 반복문을 바로 작성하려고 하기 때문이다. 생각정리를 먼저 하고 설계를 마친 뒤 코딩으로 표현해야 실수를 줄일 수 있다.
<반복의 종류>
1. for, while등 반복문
2. Iterator (향상된 for문)
3. 재귀호출
5장 . 배열
배열 : 저장공간이 여러개 --> 집합---> 객체로 본다
여러개라는 것은 이름이 필요하다는 것
객체 : 여러개를 묶은 것
참조변수를 통해서 객체나 배열의 주소값을 가지고 접근 할 수 있다.
객체를 다룰때는 반드시 참조변수가 필요하다. 객체는 여러개이므로 각각의 이름이 없고, 번호만 있다. 참조변수는 이름이 필요하다.
배열의 특징
1. 연속적
2. 크기 변경 불가 (사실 가능한데 그러면 다른 영역을 침범할 가능성이 생겨서 그냥 없다고 생각하는 것이 좋다. )
배열의 크기를 늘리는 방법
1. 다른 크기의 새로 배열을 만들고
2. 기존 배열의 값 복사
* 패턴이 존재한다는 것은 자동화가 가능하다는 뜻이다, 그러면 편의성은 늘지만 성능은 오히려 낮아진다.
2차원 배열은 1차원 배열 n개, 3차원 배열은 2차원 배열 n개를 묶은 것이다.
교환과 수정이 유용하다는 것은 쓰기와 변경이 빠르다는 것을 의미하고, 읽기는 느려서 성능이 낮아진다.
* 타입[ ] 변수이름 ; --> 타입을 다루기 위한 참조변수 선언문
ex) int [ ] score ==> int type 여러개를 다루는 참조변수 score 선언 !
타입 ---> 배열 타입
int ---> int[ ] (자동으로 정의 )
기본형 참조형
* 배열은 선언만 하면 새로운 타입이 생성된다 ! --> 내부적으로 배열 클래스가 자동으로 만들어진다.
ex) BP [ ] ; ---> BP 배열타입 , 자동정의 / BP는 ? 참조형
배열과 저장공간 생성문
*변수 이름 = new 타입[길이 ]
*for문을 사용할 때 더 좋은 설계
for(int i=0; i<=6; i++) --> 비추. i<=6 처럼 너무 세부적인 정보를 사용하는 것은 좋지 않은 설계이다.
대신에
for(int i=0; i<배열이름. length;i++) 를 사용하면 코드에서 배열의 길이를 수정할 시에 오류 발생 확률이 낮아진다.
같은 맥락에서 , 향상된 for문 for(int i=0;arr)를 사용하는 이유는 세부정보가 없기 때문에(i가 몇까지인지) 배열의 길이를 굳이 몰라도 되어 오류 발생 확률이 줄어들기 때문이다.
이처럼 프로그램은 계속 수정된다는 것을 염두하고, 그것을 고려하여 코드를작성하는 관점이 필요하다.
(사실 array.length보다는 Iterator나 향상된 for문을 선호하지만 나중에 배우기 때문에 여기선 넘어간다 )
* 배열의 크기 변경 방법
1. 더 큰 배열을 만들고
2. 이전 배열의 값을 복사하고 (System.arraycopy()함수를 사용하는 것이 for문보다 효율적이다. )
3. 참조변수 값을 변경한다.
* 배열 내용 출력 : println(Arrays.toString(arr))
< 배열의 활용>
1. 총합과 평균, 최대 최소는 for문 하나로 가능하다.
2. 섞기는 두 변수 바꾸기를 여러번 하는 것이다.
3. 정렬은 기본적으로 for문 2개로 만든다 --> 시간 복잡도 O(n^^2)
4. counting은 배열을 사용하는 것이 빠르다.
6장 객체지향적 설계
1. 분석 --> 2. 설계 --> 3. 구현
1. 관찰 --> 2. 계획 --> 3. 실천
이 과정을 잘 지키는 것이 중요하다.
신뢰성이 낮다는 것은 ? -- 조금만 과부하 되어도 쉽게 서버가 다운되고 갑자기 저장도 못한 채 꺼져서 작업 내용이 날아가는 것
선언과 정의의 차이
정의 : 없는 것을 새로 만들 때
선언 : 정의된 것을 사용한다.
변수는 정의된 데이터타입을 사용하고 ( 선언시에 데이터타입(기본형) 을 사용한다고 말한다 )
객체는 정의된 클래스를 사용한다. ( 선언 시에 클래스를 사용한다고 말한다. )
클래스의 인스턴스화가 인스턴스 , 즉 객체이다. 인스턴스는 개별적으로 독립된 주체이다.
그룹간의 관계에서
관계의 종류는
1. 상속
2. 포함이 있다.
이것은 괄호로 표현된 영역으로 이루어져 있는데
1. 클래스 = 변수+ 메서드 = 클래스 영역
2. 메서드 = 명령문 집합 = 메서드 영역
3. if, while = 블록 = 블록 영역
선언 : 객체를 다룰(사용할) 참조변수 필수
클래스명 변수명;
클래스(그룹)은 여러개가 묶인 것이므로 주소로 다룰 수 밖에 없다.
new 키워드는 메모리 안에 저장공간을 생성한다.
객체 배열 = 참조 변수 배열
- 객체 배열을 만들면 참조변수가 들어간 그냥 배열을 만드는 것이다. 여기에 선언을 각자 해주어야 배열에 객체가 생긴다.
* 클래스 변수와 인스턴스 변수의 차이는?
클래스 변수는 처음에 한번만 생기는데, 인스턴스 변수는 객체 생성시마다 새로 생긴다.
* 메서드 영역의 lv(지역변수)는 작업이 끝나면 사라진다. 클래스의 iv(인스턴스 변수)를 lv들이 공유하여 사용한다.
함수와 메서드의 차이 ? 거의 비슷하다. 다만 함수는 독립적이고 메서드는 사용하고자 하는 데이터와 연관된 함수이다.
자바는 모든 코드가 클래스 안에 있어야 한다. 함수는 밖에 있을 수 있는데, 클래스 안에 있는 함수를 메서드라고 한다.
* 입출력이란 ?
서로 다른 영역 사이에서 정보를 주고받는 과정이다.
영역 밖에 두는 이유는 재사용성을 높이고(다른 프로그램도 사용가능하게) 중복을 제거할수 있게 하기 위해서다.
* 정리
- 객체지향 프로그래밍(OOP) : 기존 프로그래밍에 몇가지 규칙을 추가 // 변경을 쉽게 하기 위해서
- 객체지향 설계 : 그룹을 만들고 그룹간의 관계 맺기
- 클래스 : 관련된 변수와 메서드를 묶은 것
- 메서드 : 관련된 문장을 묶은 것
- 영역(scope) : 괄호로 묶은 부분
1) 클래스 영역 - 인스턴스변수 (iv)
2) 메서드 영역 -----지역변수 (lv)
3) 블럭 영역 - 클래스 , 메서드 이외 {} -----지역변수 (lv)
- 인스턴스변수(iv) : 인스턴스마다 개별 저장공간
- 클래스변수(cv) : 같은 클래스의 모든 인스턴스 공유
- 오버로딩 : 같은 이름의 메서드를 여러개 정의한것
1) 메서드의 이름은 동사
2) 메서드의 이름이 같다는 것 = 하는일이 같다.
3) 오버로딩의 대표적인 예시 : println()
- 오버로딩의 조건
1) 메서드의 이름이 같아야
2) 매개변수의 개수 또는 타입이 같아야
3) 반환타입은 영향 X
- 생성자 : 인스턴스 초기화, 메서드와 iv 초기화
1) 객체 생성은 new 연산자가
2) 생성된 객체의 초기화는 생성자가 처리
- 생성자의 조건
1) 이름이 클래스와 동일
2) 반환타입 없음 ( void 안씀)
3) 다른 생성자 호출은 반드시 첫줄에서
4) 다른 생성자 호출시 this() 사용
-변수의 초기화 순서
1) cv -> iv
2) 자동-> 간단('=')-> 복잡(초기화블럭, 생성자)
자동초기화 : 타입의 기본값으로 초기화/ iv, cv
수동초기화 : 원하는 값으로 직접 초기화 : lv
-상속 : 기존의 클래스를 재사용해서 새로운 클래스를 작성
자손은 조상의 모든 멤버를 상속받는다. (생성자와 초기화블럭 제외)
-자바는 단일 상속만 허용, 즉 하나의 부모만 가질 수 있다.
- 포함: 클래스 안에 다른 클래스 타입의 iv를 선언하는 것
객체 지향적 설계란 ? SW변경에 유리하게 설계하는것 ---> 그룹을 만들고 관계 맺기
* 변수의 초기화
1. cv -> iv 순
1) 설계도 읽기(클래스) :cpu가 램에서 로딩된 클래스를 읽어온다. 이때 cv가 초기화 된다.
2) 객체 생성 : 이때 iv가 생성된다.
2. 초기화 방법
1) 자동초기화 --> 0 또는 null, false
2) 간단 초기화 : =
3) 복잡초기화 : { } , 생성자 (보통 cv는 {}, iv는 생성자로 초기화한다. 순서는 iv의 {}, cv의 {} , 생성자 순)
- 자동초기화를 하는 이유? : 객체는 여러개 이기 때문이다
* 성능 최적화 : 변동없는 변수에 static이나 final 키워드를 붙임으로써 고정, 정적 변수로 만들기
* 식별자 (identifier) : 구별
- 변수는 이름으로, 메서드는 이름(매개변수)로 구별 가능
*가변인자(varargs) : 동적으로 매개변수 지정 하는 방법
' 타입 ... 변수명 ' 으로 선언하며, 배열과 비슷하게 동작한다.
< 컴파일러의 역할>
1. 파싱 - 자르기 --> if문 사용
2. 문법체크 syntax --> if문 사용
3. 의미체크 semantic --> if문 사용
4. 최적화
5. 코드 자동화
최적화, 코드 자동화는 static, final 키워드 사용으로 성능 증가
static
1) 변수 : cv공유
2) 메서드 : iv 사용 x
* 상속 관계 표현은 일방적이다.
상호의존관계 ( 순환참조관계) -- 서로가 서로를 알고 있는 관계는 나쁜 관계이다. 한쪽이 변하면 무조건 다른 한쪽도 변하므로 어느것을 먼저 컴파일 해야 할지 모른다.
상속 관계는 집합 관계로 이해하는 것이 중요하다.
- OOP 설계 : 클래스를 작성하고, 클래스 간의 관계 작성하기
- 클래스간의 관계 : 상속, 포함 // 대부분의 경우가 포함이고 상속관계는 드물다.
- 상속과 포함을 구분하기는 어렵지 않다.
- 오버라이딩 : 조상의 메서드를 자신에 맞게 새로 작성하는것
--> 조상으로부터 무조건 모두 상속받는데, 자신하고 안맞는 부분은 바꿀 수 있게 한다.
- 오버라이딩의 조건
1. 선언부가 같아야
2. 접근제어자를 좁게 x
3. 예외 선언을 많게 x