1. 객체 지향 프로그래밍 강의
사고방식의 전환이 필요하다: (참고하기 - 객체지향 사실과 오해)
소프트웨어는 소프트웨어 세계에서 능동적으로 변한다
객체 지향 프로그래밍은 현실세계를 참조해 새로운 소프트웨어 세상을 탄생시키는 것
객체는 현실에 대한 은유다
객체 지향 설계의 핵심:
메세지: 객체들이 협력하여 목표를 달성해나가는 과정
협력: 객체들 간의 관계
*객체를 구상하고 코드로 클래스를 정의하고 생성자를 통해 인스턴스를 생성한다
(실무)패키지 이름 = 사이트 이름 ex)com.github.wikikim
Main 클래스는 소프트웨어 구동목적만 있다
Getter/ Setter 사용 지양하자
2. CS 특강 : 프로세스/ 비동기/ 스레드
프로세스: 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스*/ 운영체제로부터 시스템 자원*을 할당받은 작업의 단위
인스턴스: 설계된 것을 바탕으로 구현된 구체적인 실체
시스템 자원 : CPU 시간/ 실행되기 위해 필요한 독립된 메모리 영역
CPU는 한번에 하나의 프로세스만 실행가능
프로세스가 할당받은 독립된 메모리를 관리하기 위해 프로세스 주소 공간에서 관리한다
프로세스 주소 공간은 코드, 데이터, 스택, 힙으로 구성/ 프로세스마다 최소 1 스레드
스레드: 프로세스 내에서 프로세스의 자원을 이용하는 여러 실행흐름의 단위
프로세스 내 코드/ 데이터/ 힙 영역은 다른 스레드와 공유하고 스택은 따로 할당
프로세스와 프로세스 내 다른 스레드와 자원과 공간을 공유
프로세스 > 스레드
멀티 프로세스: 각 프로세스가 하나의 작업을 처리하도록 하는 것
장점: 자식 프로세스에 문제되는 경우 그 영향이 확산되지 않는다
단점: 문맥 교환에서의 오버헤드 ~ 메모리/ 시간 과부하
멀티 스레드: 하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것
장점: 프로세스에 비해 메모리 공간과 시스템 자원 소모가 적다/ 스레드 간 통신 시, 데이터 및 힙 메모리 영역을 이용해 데이터를 주고 받으므로 통신이 간단/ 문맥 교환시 PCB 및 캐시 메모리를 비울 필요가 없기 때문에 비용이 더 적고 빠르다
단점: 서로 다른 스레드가 데이터 및 힙 영역을 공유하기 때문에 스레드 간 공유 영역에서 자원 공유 동기화 문제가 발생/ 하나의 스레드에서 문제가 발생하면 그 영향이 전체로 간다
제어권: 제어권은 자신(함수)의 코드를 실행할 권리. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 제어권을 돌려준다.
동시성: 함수 A와 함수 B가 동시에 진행되는 것(처럼 보이는 것), 그러기 위해선 특정 함수 A가 다른 함수 B의 결과 값에 의존하는 지가 중요
블로킹 vs 논블로킹 (제어권이 누구한테 있는지)
블로킹: 함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값이 올 때까지 기다린 후 진행(제어권을 넘겨주기)
논블로킹: 함수 A가 함수 B를 호출한 뒤, 함수 B의 작업완료 여부과 상관없이 진행(제어권을 넘기지 않기)
동기 vs 비동기(호출되는 함수의 작업 완료 여부)
동기: 함수 A와 B를 호출할 때, 함수 A가 함수 B의 리턴 값을 계속 확인
비동기: 함수 B의 작업 완료 여부 불문하고 함수 A와 함수 B 호출
JAVA 비동기 vs JS 비동기
3. 계산기 클래스 작성 실습
요구사항 2번과 4번에서 헷갈림 ~ 계속 실습해서 동작원리에 익숙해지기
class Calculator {
int value;
Calculator() {
this.value = 0;
}
void add(int val) {
this.value += val;
}
int getValue() {
return this.value;
}
boolean isOdd(int val) { //Boolean vs boolean
if(value % 2 == 0) {
return false;
} else {
return true;
}
}
}
class UpgradeCalculator extends Calculator {
void minus(int val) {
this.value -= val;
}
}
class MaxLimitCalculator extends Calculator {
@Override // 상속받은 메서드를 변경하는 것
int getValue() {
if (this.value > 100) {
System.out.println("결과가 100을 초과합니다");
return 0;
} return super.getValue();
}
public class Sample {
public static void main(String[] args) {
Calculator cal = new Calculator();
cal.add(10);
System.out.println(cal.getValue());
}
}
+ JAVA 기초 학습자료
Getter/Setter
/*
**1) Getter**
- 멤버 변수의 값을 조회하기 위한 메서드
- `get멤버변수명()` 의 형식으로 명명
- `객체변수.get멤버변수명()` 의 형식으로 사용
**2) Setter**
- 멤버 변수에 값을 할당하기 위한 메서드
- `set멤버변수명(파라미터)` 의 형식으로 명명
- `객체변수.set멤버변수명(파라미터)` 의 형식으로 사용
*/
public int getBalance() { // Getter
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
'내일배움캠프 4기 스프링 > 내배캠 TIL📘' 카테고리의 다른 글
11. 22 객체 지향 프로그래밍/ JAVA (0) | 2022.11.23 |
---|---|
11. 21 객체 지향 프로그래밍/ JAVA 기초 복습 (0) | 2022.11.21 |
11. 17 객체 지향 프로그래밍 강의/ JAVA/ 알고리즘 강의 (0) | 2022.11.17 |
11. 16 알고리즘 TIME ATTACK 풀이/ JAVA 기초 강좌 (0) | 2022.11.16 |
11. 15 JAVA 기초 강의/ 알고리즘 강의 + 그림으로 배우는 알고리즘 (0) | 2022.11.15 |