패스트캠퍼스 백엔드 부트캠프 3기

[패스트캠퍼스 백엔드 부트캠프 3기] 1주차 정리

다름임 2024. 12. 23. 10:13

1. 프로그램과 객체지향형 설계

프로그램이란?

pro(앞을 뜻하는 전치사) + gram(text / 순차적으로 명령을 나열한것) 

Data + 명령으로 이루어진 문장의 나열이다.

(프로그램 예시. 실제 명령과는 다르지만 이해를 위해 직관적으로 작성) 
3 + 5 
2 * 10  

 

여기에서 3,5,2,10 은 'data' 이고 , '3 + 5'와 '2 * 10' 은 명령이다. ('+' 와 ' * '은 연산자)

컴퓨터에서 프로그램은 CPU가 처리한다. 

 

 

 

CPU의 역할
1. 계산
2. READ
3. WRITE
4. Jump (if/while 반복문) 

 

간단한 프로그램 예시를 들어보겠다.

(프로그램 예시)
명령 1  mov al, [num1]   ; num1 읽기
명령 2  add al, [num2]    ; num2 더하기
명령 3  mov[result], al    ; 결과 저장
명령 4  cmp al,8             ; 결과가 8인지 확인 (조건문)
명령 5  jne multiply        ; 아니면 multiply로 Jump

 

명령 1부터 명령 5까지를 순차적으로 read/ write하며 계산을 진행한다. 

명령은 계산으로 이루어져 있으며, 만약 중간에 jump (이 프로그램에서는 'jne'가 해당된다)가 있으면 조건문이 if 인 경우 뒤로, while문일경우에는 앞으로 돌아간다. 

 

이 프로그램을 작성할 때 비용을 줄일 수 있는 방법은 최대한 JUMP문을 피하는 것이다. 

 

 

 

 

 

프로그램에서 비용을 줄이는방법은?
: 튜닝과 설계를 통하여 공통설계를 한다. 

 

튜닝(최적화) : 더 낮은 등급의 코드 ( 직관적인 코드) 로 변환하는 과정

(예시) 
for(int i = 1; i <= 5; i++){
       y += i;
}

--------------(튜닝)-----------------

y = 1 + 2 + 3 + 4 + 5;

 

 

자바(Java)에서는 크게 두가지 프로그래밍이 있다. 

OOP(객체 지향 프로그래밍) , FP(함수형 프로그래밍)

OOP 설계란?

집합을 어떻게 구성할지 생각하는 것이다. 

 

OOP(Object- Oriented Programming)은 프로그램 설계 방법론의 일종으로 

집합과 그것들을 이루고 있는 관계를 통해서 그룹화 하는 과정을 거쳐 전체 시스템의 복잡도를 낮춘다. 

 

Java 프로그램 에서는 객체를 집합의 개념으로 생각하여 다룰 수 있다.

 

 

 

2. 값(value)과 타입의 관계

 

값(value) : 특정 데이터를 표현하는 구체적인 단위

값이 시스템에서 사용되기 위해서는 (데이터) 타입이 필요하다 . 

 

값에 형식과 의미를 부여하는 것이 데이터 타입이다. 

시스템이 해당 값을 올바르게 저장, 처리, 해석할 수 있게 해주는 과정이다.

 

그렇다면 값을 구분하기 위해서는 타입을 알면 된다. 

 

시스템에 사용되는 값은 Data와 동의어로 볼 수 있다. 

그러면 값(Data)의 종류는 크게 4가지로 구분된다. 

1. 숫자 
2. 문자
3. 논리형
4. 주소

 

숫자는 정수와 실수로 나누어지고, 문자는 'A' 등 한가지 문자로 이루어지는데, 프로그램상에서 'A'는 정수 65로 대체될 수 있다. 그렇다면 문자는 결국 정수가 된다. 

논리형은 0과 1로 이루어지는데, 이는 결국 정수값이다. 

주소는 0x12등으로 표현되는데, 이도 마찬가지로 정수값이다. 

따라서

값은 크게 정수형과 실수형으로 구분할 수 있다. 

 

 

cf. 주소는 언제 사용할까 ? --> 값을 여러개 넣고 싶을 때, 그룹 안에 값 여러개를 넣고, 그 그룹의 주소를 가져오는 방법을 사용한다. 

cf. 값이 여러개라는 것은 집합이라는 것을 의미하고, 자바에서는 객체로 표현한다.

 

 

3. 컴파일러와 데이터, 타입

 

값에 타입이 지정되면 시스템에서 유의미한 데이터가 될 수 있다고 했다. 

그럼 이 데이터를 담을 저장 공간이 필요해지는데, 이것을 변수 라고 한다. 

 

(변수란? 1개 값의 저장공간이다. )

( 변수의 중요 개념) 
1. 변수 선언 ( 저장공간 만들기 ) 
2. Read
3. Write
4. 두 변수값 바꾸기 
5. 형변환

 

 

 

자바의 컴파일러 : javac 

 

컴파일러는 if문으로 구성되어 있다. 

소스코드가 컴파일러를 통해서 클래스 파일로 변환되는데 

컴파일러는 두가지 역할을 한다. 

1. if문을 통한 타입 체크

2. 번역 

 

 

우리가 소스코드를 작성할 때 값을 data로 사용하기 위해서는 type을 붙여준다. 그런데 type이 값과 잘 매칭되는지 확인하는 과정이 필요하게 된다. 직접 확인하는 방법은 소스코드 내에 추가적으로 if문을 작성하여 조건과 일치하는지 확인하는 것이다.  그래야 프로그램이 원하는 목적을 달성할 수 있는데, 

컴파일러는 우리가 타입이 적절하게 붙여졌는지 확인하는 과정을 대신 해준다. 

반대로 생각하면, type을 값에 붙이게 되면 우리가 직접 작성해야 하는 if문이 줄어들게 되고, 이는 코드의 간결화를 달성하고 이는 코드의 에러 가능성을 낮추고 프로그램의 질을 높인다. 

컴파일러는 type이 없으면 체크 불가능하다. 

 

컴파일러는 타입 체크를 왜 할까?
--> 원하는 목적의 값이 잘 들어가게 해야 하기 때문에 다른 값이 들어가지 못하도록 한다. 

 

 

그럼 타입은 값에 대한 조건이며 필터라고 정리할 수 있다. 

 

 

컴파일러는 정확히 말하면 소스코드를 체크하여 바이너리 코드 (실행파일)을 생성하며, 이것을 cpu에 전달한다. 

 

 

 

(참고)

* 소프트웨어는 하드웨어의 가상화 버전이다. 

사용 이유? --> 변경을 용이하게 하기 위해서 

* 하드웨어는 단순화하고, 컴파일러의 성능 극대화, 최적화로 소프트웨어를 변경하는 방법이 제일 적절하다. 

* 에뮬레이터 : 하드웨어를 소프트웨어로 가상화한것 

ex) java의 에뮬레이터 : JVM(java virtual machine) 

책을 emulator를 통해 pc에서 ebook으로 볼 수 있다. 

 

 

 

4. 연산자와 식, 문장

연산자는 계산 기호이다 .

 

 

연산자의 종류 (4가지) 

1. 계산 : + , - , * , / , %
2. 비교 : < , >, <=, >=, ==, !=
3. 논리 : && , || , ! --> 조건과 결합하면 각각 교집합, 합집합, 여집합으로 생각할 수 있다. 
4. 대입 : =

 

 

연산자는 반드시 하나의 결과를 반환한다. 

 

 

Q. (2+3) * 8이라는 연산식에서 () 괄호는 연산자인가  ?

-->  X. 결과 반환이 없기 때문 ( 우선순위를 수동으로 설정하는 것일 뿐이다. ) 

 

 

연산자의 특징 

1. 자동 우선순위 부여 
 - 곱하기, 나누기는 더하기, 빼기보다 우선순위가 높다.
2. 결합 방향 존재 ( 왼->오, 오->왼)
 - 대입연산자를 제외한 모든 연산자는 왼쪽에서 오른쪽으로 진행한다. 
3. 서로 다른 타입 연산시 산술 변환 규칙 
 - 1) 둘중에 더 큰 타입으로 변환한다 
 - 2) int보다 작은 타입( byte, short)은 int로 변환한다. 
ex) float * double =  double * double  /  byte * short = int * int

 

 

식과 문장의 차이

식은 반드시 결과가 존재한다. ex) 3 + 5 

문장은 결과가 있을수도 있고, 없을 수도 있다. 

 

문장의 종류

1. 선언문
- 변수, 함수(메서드), 클래스
2. 대입문
- 'x = 5' 는 식이면서 문장이다. (결과를 반환하냐에 따라 구분함) 
3. 조건문과 반복문
- 결과 없음

 

 

*삼항 연산자  : if문을 연산자로 변환한것 ( 문장을 식으로 변환) 

- 셋중에 하나를 선택하는 문제는 삼항연산자를 이중으로 사용한다. 

 

 

 

5. 기타 정리

 

* 실수의 오차가 발생하는 경우

1. 원래 오차가 존재할때 (ex. 1/3 = 0.333333...)

2. 10진수 실수를 2진수 실수로 변환시 오차가 발생하는 경우 

3. 저장공간 부족으로 실수 표현 범위가 짤리는 경우 

 

cf. )

* 상수 final 키워드는 성능 튜닝 , 즉 최적화와 관련이 있다. 

* 설계는 크게 RDB와 OOP, 튜닝은 크게 JVM과 RDB로 나누어진다.