본문 바로가기

내일배움캠프 4기 스프링/내배캠 TIL📘

11. 18 객체 지향 프로그래밍 강의/ CS 강의/ 백문이불여일타(1): 계산기, JAVA

728x90

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;
}

 

728x90