no image
[JAVA]Optional이란?
➡️Optional이란? Java8에서 Optional클래스를 사용해 NPE(NullPointException)을 방지할 수 있도록 도와준다.Optional는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE가 발생하지 않도록 도와준다. Optional 클래스는 value에 값을 저장하기 때문에 value가 null이어도 NPE를 발생시키기 않는다. ➡️NPE(NullPointException) 우리가 개발을 할때 가장 많이 발생하고 힘들게하는 예외 중 하나가 NPE(NullPointException)이다. NPE(NullPointException)를 발생시키지 않을려면 null을 검증하는 로직을 추가 해야 하는데 , null을 검증해야하는 변수가 많으면 많을수록 코드가 지..
2021.06.17
no image
[JAVA]상속(Inheritance)
👉상속이란? 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현함 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속함 상속하는 클래스 : 상위 클래스, parent class, base class, super class 상속받는 클래스 : 하위 클래스, child class, derived class, subclass 👉상속 문법 class b extends a{ //a가 b를 상속한다 } 👉상속을 구현하는 경우 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가진다. 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가진다. 하위 클래스가 상위 클래스의 속성과 기능을 확..
2021.06.16
no image
객체 지향 프로그래밍(OOP)
📖객체 지향 프로그래밍이란 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지 를 주고받고, 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프 트웨어 개발에 많이 사용된다. 유연하고 , 변경이 용이 하다는건 컴퓨터 부품을 갈아 끼우듯이 프로그래밍이 가능하다는 것이다. 📖다형성이란 다형성은 객체 지향 프로그래밍에 핵심이라고 할 수 있다. 다형성은 역할과 구현으로 세상을 구분한다.(EX:운전자 -자동차,공연 무대) 역할과 구현으로 구분하면 단순해지고, 유연해지며 변경도 편리해진다. 다형성으로 인터페이스를 구현한 객체 를 실..
2021.06.16
Dev
no image
[CS]스레드(Thread)란?
📖스레드란 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다. 각 스레드(Thread)는 Thread ID, 프로그램 카운터,레지스터 집합, 스택으로 구성되어 있다. 같은 프로세스에 속하는 스레드는 서로 코드, 데이터 섹션, Heap, 열린파일이나 신호와 같은 운영체제 자원들을 공유한다. 📖스레드가 필요한 이유 웹서버는 수많은 클라이언트로부터 요청을 받는다.만약 단일 프로세스로 작동한다면 ,자신의 단일 프로세스로 한번에 하나의 클라이언트만을 서비스 할 수 있게되어 오랫동안 기다려야한다. 📖멀티태스킹과 멀티스레드 👉 멀티 태스킹 멀티태스킹은 하나의 운영체제 언에서 여러 프로세스가 실행되는것을 의미한다. 멀티태스킹은 여러 프로세스가 동시에 실행되는 것처럼 보이지만 자세한 원리를 알아보면 그렇지 않다...
2021.06.15
no image
[JAVA]삼항연산자(Ternary Operator)
👉삼항연산자란? 3개의 피연산자를 필요로 하는 연산자이다. 👉문법 문법은 어려운 편은 아니다. true/false를 판단할 수 있는 변수 또는 조건식을 작성한 후에 연산결과인 true/false에 실행되는 표현식을 작성하면 된다. 조건식의 결과가 false이면 식2가 결과가 되고 true이면 식 1이 결과가 된다. 1 2 3 int b1 = (5>4) ? 50 : 40; //조건식이 true이므로 결과값은 50이 나온다.​ cs 🙉가장 기본적인 예제이다. 1 2 3 4 5 6 7 8 //(조건식1) ? true : (조건식2) ? true : false //조건식1이 false이면 조건식2를 수행한다.조건식2는 일반 삼항 연산자처럼 실행된다. //삼항연산자를 중첩해서 사용하면 if문 대신에 사용할 수 있..
2021.06.15
no image
[CS]프로세스(Process)란?
💻프로세스란? 프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 💻프로그램과 프로세스의 차이 프로그램 자체에는 생명이 없다.프로그램은 보조 기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이다. 이 프로그램의 명령어와 정적 데이터가 자원을 할당받고 메모리에 적재되면 프로세스가 된다. 💻프로세스의 특징 병행 실행이 가능하다 하나의 프로그램이 여러 프로새스 생성이 가능하다. 각각 독립된 메모리 영역과 주소 공간을 운영체제로 부터 할당 받는다. 💻프로세스 구조 text(code) :우리가 작성한 소스코드가 들어가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다. 함수, 제어문, 상수 등이 여기에 지정된다. data : 전역변수와 s..
2021.06.13
Dev
no image
[CS]인터럽트(Interrupt)
🙉인터럽트란? CPU가 프로그램을 실행하고 있을 때, 압출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 CPU에 알려서 처리하는 기술이다. 인터럽트는 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다. 하드웨어 인터럽트는 하드웨어가 발생시키는 인터럽트로, CPU가 아닌 다른 하드웨어 장치가 CPU에 어떤 사실을 알려주거나 CPU 서비스를 요청해야 할 경우 발생시킨다. 하드웨어 인터럽트는 주로 전원 이상, 기계 문제,키보드등 IO 관련 이벤트 등이 있다. 소프트웨어 인터럽트는 소프트웨어가 발생시키는 인터럽트이다. 소프트웨어(사용자 프로그램)가 스스로 인터럽트 라인을 세팅한다.(종류: 예외 상황,System Call) 소프트웨어 인터럽트의 예로는 사용자 모드에서 허용되지 않은 명령 또..
2021.06.13
no image
[CS]Context Switching(컨택스트 스위칭)
📖Context(Context)란? CPU가 특정 프로세스를 실행시키기 위한 프로세스의 정보들이다. Context는 프로세스의 PCB(Process Control Block)에 저장되어 Context Switching(컨택스트 스위칭)을 실행 할 때 PCB의 정보를 읽어 CPU가 이전에 프로세스가 하던 일을 이어서 수행 가능하다. 👉PCB에는 다음과 같은 정보들이 저장된다. 프로세스의 상태 : 생성,준비,수행,대기,중지 프로그램 카운터 : 프로세스가 다음 실행할 명령어 주소 레지스터 : 누산기,스택, 색인 레지스터 프로세스 번호 📖Context Switching(컨택스트 스위칭)이란? 멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서,인터럽트 요청에 의해 다음 우선 순위의 프..
2021.06.13

[JAVA]Optional이란?

ryudjae
|2021. 6. 17. 14:30
728x90

➡️Optional이란?

  • Java8에서 Optional<T>클래스를 사용해  NPE(NullPointException)을 방지할 수 있도록 도와준다.Optional<T>는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE가 발생하지 않도록 도와준다. Optional 클래스는 value에 값을 저장하기 때문에  value가 null이어도 NPE를 발생시키기 않는다.

 


➡️NPE(NullPointException)

 우리가 개발을 할때 가장 많이 발생하고 힘들게하는 예외 중 하나가 NPE(NullPointException)이다. NPE(NullPointException)를 발생시키지 않을려면 null을 검증하는 로직을 추가 해야 하는데 , null을 검증해야하는 변수가 많으면 많을수록 코드가 지저분해지고 로직이 번거로워진다.그래서 null대신 초기값을 사용하기를 권장하기도 한다.

 

➡️Optional  객체 생성

>Optional.of : value가 null인 경우 NPE예외를 던진다. 반드시 값이 있어야 하는 객체인 경우 해당 메서드를 사용하면 된다.

>Optional.ofNullable : value가 null 인 경우 비어있는 Optional을 반환한다. 값이 null일수도 있는 것은 해당 메서드를 사용하면 된다.

 

>Optional.empty : 비어있는 Optional객체를 생성한다. 조건에 따라 분기를 태워야하고 반환할 값이 없는 경우에도 사용된다.

 

➡️Optional 중간처리 

:Optional 객체를 생성 한 후 사용가능한 메서드이다. 해당 메서드들은 다시 옵셔널을 반환하므로 메서드 체이닝을 통해 원하는 로직을 반복 삽입할 수 있습니다.

 

>filter

:predicate(반환값) 값이 참이면 해당 필터를 통과시키고 거짓이면 통과를 하지 못한다.

1
2
3
4
5
6
// 메서드 시그니처
public Optional<T> filter(Predicate<super T> predicate);
// 예제
Optional.of("True").filter((val) -> "True".eqauls(val)).orElse("NO DATA"); // "True"
Optional.of("False").filter((val) -> "True".eqauls(val)).orElse("NO DATA"); // "NO DATA"
 
cs

 

>map

: mapper 함수를 통해 입력값을 다른 값으로 변환하는 메서드이다.

1
2
3
public<U> Optional<U> map(Function<super T, ? extends U> mapper);
// 예제
Integer test = Optional.of("1").map(Integer::valueOf).orElseThrow(NoSuchElementException::new); // string to integer
cs

 

>flatMap

:mapper 함수를 통해 입력값을 다른 값으로 변환하는 메서드이다. map()메서드와 다른점은 메서드 시그니처의 매개변수입니다.

1
2
3
4
5
6
7
// 메서드 시그니처
public<U> Optional<U> flatMap(Function<super T, Optional<U>> mapper);
// 예제
String result = Optional.of("result")
        .flatMap((val) -> Optional.of("good"))
        .get();
System.out.println(result); // print 'good'
cs
 

 

➡️Optional 종단처리

>.ifPresent

최종적으로 연산을 끝낸 후 값이 비어있지 않다면 입력값으로 주어진다. 이 값을 가지고 원하는 작업을 수행하면 된다. 하지만 중간 연산을 하다 비어있는 옵셔널 객체를 받게 되면 .ifPresent() 메서드의 내용을 수행하지 않는다.

1
2
3
4
5
6
7
8
9
10
// 메서드 시그니처
public void ifPresent(Consumer<super T>; consumer);
// 예제1
Optional.of("test").ifPresent((value) ->; {
    // something to do
});
// 예제2 (ifPresent 미수행)
Optional.ofNullable(null).ifPresent((value) ->; {
    // nothing to do
});
cs

 

 

>.isPresent

최종적으로 연산을 끝낸 후 객체가 존재하는지 여부를 판별한다.

1
2
3
4
5
// 메서드 시그니처
public boolean isPresent();
// 예제
Optional.ofNullable("test").isPresent(); // true
Optional.ofNullable("test").filter((val) ->"result".eqauls(val)).isPresent(); // false
cs

 

>.get

: 최종적으로 연산을 끝낸 후 객체가 존재하는지 여부를 판별한다. 없으면 예외를 던진다.

1
2
3
4
5
// 메서드 시그니처
public T get();
// 예제
Optional.of("test").get(); // 'test'
Optional.ofNullable(null).get(); // NoSuchElementException
cs

 

>.orElse

: 최종적으로 연산을 끝낸 후에도 Optional객체가 비어있다면 기본값으로 제공할 객체를 지정한다.

1
2
3
4
5
/ 메서드 시그니처
public T orElse(T other);
// 예제
String result = Optional.ofNullable(null).orElse("default");
System.out.println(result); // print 'default'
cs

 

>.orElseGet

: 최종적으로 연산을 끝낸 후에도 옵셔널 객체가 비어있다면 기본값으로 제공할 공급자 함수를 지정합니다.

1
2
3
4
5
// 메서드 시그니처
public T orElseGet(Supplier<extends T> other);
// 예제
String result = Optional.ofNullable("input").filter("test"::equals).orElseGet(() ->"default");
System.out.println(result); // print 'default'
cs

 

 

>.orElseThrow

최종적으로 연산을 끝낸 후에도 Optional객체가 비어있다면 예외 공급자 함수를 통해 예외를 발생시킨다.

1
2
3
4
// 메서드 시그니처
public <extends Throwable> T orElseThrow(Supplier<extends X> exceptionSupplier) throws X;
// 예제
Optional.ofNullable("input").filter("test"::equals).orElseThrow(NoSuchElementException::new);
cs

 

 

orElse, orElseGet 중 무엇을 사용할까?

orElse 메서드는 옵셔널 객체가 비어있든 비어있지 않든 반드시 실행 한다. orElseGet 메서드는 옵셔널 객체가 비어있으면 실행합니다. 따라서 기본값을 주고자 할때에 기본값을 구하는 과정이 오래 걸린다면 orElseGet을 사용하는게 좋다.

 

 

 

👉다음에는 JAVA9,JAVA10 에 추가된 메서드를 추가해볼 예정이다.

 


Reference

728x90

'Dev > JAVA' 카테고리의 다른 글

[Code] Refactoring , 리펙토링  (0) 2022.02.28
[Design Pattern] 빌더 패턴(Builder Pattern)  (0) 2021.12.02
[JAVA]상속(Inheritance)  (0) 2021.06.16
[JAVA]삼항연산자(Ternary Operator)  (0) 2021.06.15
[JAVA]Primitive type과 Reference type  (0) 2021.04.07

[JAVA]상속(Inheritance)

ryudjae
|2021. 6. 16. 17:56
728x90

👉상속이란?

  • 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현함
  • 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속함

상속하는 클래스 : 상위 클래스, parent class, base class, super class
상속받는 클래스 : 하위 클래스, child class, derived class, subclass

👉상속 문법

class b extends a{
//a가 b를 상속한다
}

👉상속을 구현하는 경우

  • 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가진다.
  • 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가진다.
  • 하위 클래스가 상위 클래스의 속성과 기능을 확장 (extends)한다는 의미이다.

👉예제로 동물을 상위클래스로 두고 상속 받는 다른클래스를 만들어보자

상위클래스인 동물 클래스를 만든다.

1
2
3
4
5
6
7
public class Animal {
    String name;
 
    public void setName(String name) {
        this.name = name;
    }
}
cs

 

Dog라는 animal하위클래스를 하나 만든다.

 

1
2
3
4
5
6
7
8
9
public class Dog extends Animal {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);
    }
}
 
 
cs

 

실행해보면 "poppy"라는  문자열이 출력된다.

1
2
3
4
5
6
7
8
9
10
11
12
public class Dog extends Animal {
    public void sleep() {
        System.out.println(this.name+" zzz");
    }
 
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);
        dog.sleep();
    }
}
cs

Dog클래스에 sleep이라는 메소드를 추가하였다.

이제 Dog 클래스는 Animal 클래스보다 좀 더 많은 기능(sleep메소드가 추가되었다.)을 가지게 되었다. 이렇듯 보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 더하여 좀 더 많은 기능을 갖도록 설계한다.

 

👉IS-A 관계

Dog클래스는 Animal클래스를 상속받았다. 즉, Dog는 Animal의 하위 개념이라고 할 수 있겠다. 이런 경우 Dog는 Animal에 포함되기 때문에 "개는 동물이다"라고 표현할 수 있다. 

자바는 이러한 관계를 IS-A 관계라고 표현한다. 즉 "Dog is a Animal" 과 같이 말할 수 있는 관계를 IS-A 관계라고 한다.

그러나 부모 클래스로 만들어진 객체를 자식 클래스의 자료형으로는 사용할 수 없다.

Dog dog = new Animal();  

이렇게 사용하면 컴파일 오류가 발생한다.

 

👉메소드 오버라이딩 (Method overriding) ->상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용

메소드 오버라이딩이란?

 

  • 오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있다.
  • 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받는다.
  • 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있다.
  • 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미한다.

오버라이딩의 조건

  • 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 합니다.
  • 하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있습니다.
  • 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없습니다
  • 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없습니다.

👉메소드 오버로딩 (Method overloading) ->같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

   메소드 오버로딩이란 ?

  • 메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미한다.
  • 자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없다.
  • 하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있다.
  • 즉, 메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것이라고 할 수 있다.
  • 이러한 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있다.
  • 또한, 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있게 된다.
  • 메소드 오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나이다.

 메소드 오버로딩의 조건

  • 메소드의 이름이 같아야 한다.
  • 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 한다.

 

 

Reference

 

 

728x90

'Dev > JAVA' 카테고리의 다른 글

[Code] Refactoring , 리펙토링  (0) 2022.02.28
[Design Pattern] 빌더 패턴(Builder Pattern)  (0) 2021.12.02
[JAVA]Optional이란?  (0) 2021.06.17
[JAVA]삼항연산자(Ternary Operator)  (0) 2021.06.15
[JAVA]Primitive type과 Reference type  (0) 2021.04.07
728x90

 

📖객체 지향 프로그래밍이란

  • 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지 를 주고받고, 데이터를 처리할 수 있다. 
  • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프 트웨어 개발에 많이 사용된다.
  • 유연하고 , 변경이 용이 하다는건 컴퓨터 부품을 갈아 끼우듯이 프로그래밍이 가능하다는 것이다.

📖다형성이란

  • 다형성은 객체 지향 프로그래밍에 핵심이라고 할 수 있다.
  • 다형성은 역할과 구현으로 세상을 구분한다.(EX:운전자 -자동차,공연 무대)
  • 역할과 구현으로 구분하면 단순해지고, 유연해지며 변경도 편리해진다.
  • 다형성으로 인터페이스를 구현한 객체 를 실행 시점에 유연하게 변경할 수 있다.
  • 오버라이딩 된 메서드가 실행된다.

👉역할과 구현의 분리하면 장점

  • 클라이언트는 대상의 역할(interface)만 알면 된다.
  • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
  • 클라이언트는 구현 대상의 내부구조가 변경되어도 영향을 받지 않는다.
  • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
  • 자바에서는 다형성을 활용한다. => 역할 : 인터페이스(interface),  구현: 인터페이스를 구현한 클래스( class),구현 객체

+@ 자바에서 설계할 때 역할과 구현을 명확히 분리

+@객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기

 

 

💻좋은 객체 지향 설계의 5가지 원칙 💻

 

SOLID =>클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리

  • SRP: 단일 책임 원칙(single responsibility principle)  : 한 클래스는 하나의 책임만 가져야 한다.
  • OCP: 개방-폐쇄 원칙 (Open/closed principle) : 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
  • LSP: 리스코프 치환 원칙 (Liskov substitution principle): 프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야한다
  • ISP: 인터페이스 분리 원칙 (Interface segregation principle): 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
  • DIP: 의존관계 역전 원칙 (Dependency inversion principle) : 추상화에 의존해야지,구체화에 의존하면 안된다.

 

 

728x90

'Dev' 카테고리의 다른 글

DataBase Engine(데이터 베이스 엔진)  (0) 2021.09.28
프록시(Proxy)란  (0) 2021.07.26
[CS]프로세스(Process)란?  (0) 2021.06.13
[Network]URL,URI,URN의 정의  (0) 2021.04.13
IntelliJ 단축키(MAC)  (0) 2021.03.11
728x90

📖스레드란

  • 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다.
  • 각 스레드(Thread)는 Thread ID, 프로그램 카운터,레지스터 집합, 스택으로 구성되어 있다.
  • 같은 프로세스에 속하는 스레드는 서로 코드, 데이터 섹션, Heap, 열린파일이나 신호와 같은 운영체제 자원들을 공유한다.

https://m.blog.naver.com/three_letter/220333796848

 

📖스레드가 필요한 이유

  • 웹서버는 수많은 클라이언트로부터 요청을 받는다.만약 단일 프로세스로 작동한다면 ,자신의 단일 프로세스로 한번에 하나의 클라이언트만을 서비스 할 수 있게되어 오랫동안 기다려야한다.

 

 

📖멀티태스킹과 멀티스레드

  👉 멀티 태스킹

  • 멀티태스킹은 하나의 운영체제 언에서 여러 프로세스가 실행되는것을 의미한다.
  • 멀티태스킹은 여러 프로세스가 동시에 실행되는 것처럼 보이지만 자세한 원리를 알아보면 그렇지 않다.

   👉멀티스레드

  • 대부분의 프로그램은 하나의 프로세스안에 여러개의 스레드로 구성해서 처리하는 방식을 사용한다.이를 멀티스레딩이라 한다.
  • 자원을 공유해서 효과적이고, 통신간 비용이 적다.

 

 

📖멀티스레드 장단점

🤨멀티스레드 장점

  • 시스템 자원 소모 감소 (자원의 효율성 증대) :프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리 할 수 있다.
  • 시스템 처리량 증가(처리 비용 감소) : 스레드 사이의 작업량이 작아 Context Switching이 빠르다.
  • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축: 스레드는 프로세스 내의 Stack영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.

😟멀티스레드 단점

  • 스레드 하나가 프로세스 내부 자원을 망쳐버리면 모든 프로세스가 종료될 수 있다.
  • 자원을 공유하기 때문에 동기화 문제가 발생할 수 밖에 없다.

👉동기화 문제(Synchronization Issue)는 멀티스레드를 사용하면 각각의 스레드 중에 어떤 것이 우선 순서로 실행되는지 알 수 없다.

      만약 A 스레드가 어떤 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은

      A스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.그러므로 프로그래머가 직접 동기화

      문제에 대응할 수 있어야 한다.

 

 

💻마무리

스레드는 프로세스 안에 포함되어 있기 때문에,프로세스와 개념의 법위부터가 다르다.

운영체제가 프로세스에게 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 작업 단위로 삼는 반면, 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.

 

멀티태스킹보다 멀티스레드가 자원을 아낄 수 있게 된다. 다만 스레드의 스케줄링은 운영체제가 처리하지 않기 때문에 프로그래머가 직접 동기화 문제에 대응할 수 있어야 한다.

 

References

 

728x90

'Dev > ComputerScience' 카테고리의 다른 글

[CS]인터럽트(Interrupt)  (0) 2021.06.13
[CS]Context Switching(컨택스트 스위칭)  (0) 2021.06.13
728x90

👉삼항연산자란?

  • 3개의 피연산자를 필요로 하는 연산자이다.

👉문법

사진 출처:https://cremazer.github.io/java-Types-of-Operators/

  • 문법은 어려운 편은 아니다. true/false를 판단할 수 있는 변수 또는 조건식을 작성한 후에 연산결과인 true/false에 실행되는 표현식을 작성하면 된다.
  • 조건식의 결과가 false이면 식2가 결과가 되고 true이면 식 1이 결과가 된다.
1
2
3
  int b1 = (5>4) ? 50 : 40;
  
  //조건식이 true이므로 결과값은 50이 나온다.​
cs

 

  • 🙉가장 기본적인 예제이다.
1
2
3
4
5
6
7
8
//(조건식1) ? true : (조건식2) ? true : false
//조건식1이 false이면 조건식2를 수행한다.조건식2는 일반 삼항 연산자처럼 실행된다.
//삼항연산자를 중첩해서 사용하면 if문 대신에 사용할 수 있다.
 
int a = 10
int b = 10
 
System.out.println((a &gt; b) ? "a는 b보다 크다" : (a &lt; b) ? "b는 a보다 크다" : "a와 b는 같다.");
cs

🙉이 예제는 삼항연산자를 중첩해서 사용하는 코드이다.

728x90

'Dev > JAVA' 카테고리의 다른 글

[Code] Refactoring , 리펙토링  (0) 2022.02.28
[Design Pattern] 빌더 패턴(Builder Pattern)  (0) 2021.12.02
[JAVA]Optional이란?  (0) 2021.06.17
[JAVA]상속(Inheritance)  (0) 2021.06.16
[JAVA]Primitive type과 Reference type  (0) 2021.04.07

[CS]프로세스(Process)란?

ryudjae
|2021. 6. 13. 19:09
728x90

💻프로세스란?

  • 프로세스는 컴퓨터에서 연속적으로  실행되고 있는 컴퓨터 프로그램을 말한다.

💻프로그램과 프로세스의 차이

  • 프로그램 자체에는 생명이 없다.프로그램은 보조 기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이다.
  • 이 프로그램의 명령어와 정적 데이터가 자원을 할당받고 메모리에 적재되면 프로세스가 된다.

💻프로세스의 특징

  • 병행 실행이 가능하다 
  • 하나의 프로그램이 여러 프로새스 생성이 가능하다.
  • 각각 독립된 메모리 영역과 주소 공간을 운영체제로 부터 할당 받는다.

💻프로세스 구조

  • text(code) :우리가 작성한 소스코드가 들어가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다. 함수, 제어문, 상수 등이 여기에 지정된다.
  • data : 전역변수와 static 변수가 할당되는 부분. 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸되는 영역. (데이터 영역을 초기화여부에 따라 Data와 BSS로 나눠서 설명하기도 한다.)
  • stack :프로그램이 자동으로 사용하는 임시 메모리 영역. 함수 호출시 생성되는 지역변수와 매개변수가 저장되는 영역이고, 함수 호출이 완료되면 사라짐.
  • heap :  프로그래머가 할당/해제하는 메모리 공간. 이 공간에 메모리를 할당하는 것을 동적할당이라고도 부른다.

💻프로세스 상태

 

1.new:프로세스 생성중이다.

  •  프로세스를 생성하고 있는 단계로 커널 공간에 PCB가 만들어진 상태이다.

2.ready:프로세스가 CPU를 기다리는 상태이다.

  • 프로세스가 메모리에 적재된 상태로 실행하는데 필요한 자원을 모두 얻은 상태이다.
  • 아직 CPU를 받지는 않았지만 CPU를 할당 받으면 바로 실행 가능한 상태이다.

3.running : 프로세스가 CPU를 할당받아 명령어를 수행중인 상태이다.

  • 일반적으로 CPU가 하나이기 때문에, 여러 프로세스가 동시에 실행되도 실제로 실행중인 프로세스는 매 시점 하나 뿐이다.

4.Waiting: CPU를 할당해주어도 실행할 수 없는 상태이다.

  • 현재 프로세스가 I/O작업 등을 을 처리중 상태를 의미한다.

5.terminated : 프로세스의 실행 종료

  • 프로세스의 실행이 완료되고 할당된 CPU를 반납하고, 커널공간내의 PCB는 남아 있다.

 

📖프로세스가 다른 프로세스의 정보에 접근하는 방법

 프로세스도 안될거 같았지만 다른 프로세스의 정보에 접근하는 것이 가능하다.다만 이 경우에는 단순히 CPU레지스터를 교체하는 것뿐만 아니라 RAM과 CPU사이의 캐시 메모리까지 초기화 되기때문에 자원부담이 크다.

프로세스가 다른프로세스의 정보에 접근하기 위해서는 특정한 기법을 사용하여야 접근 할 수 있다.

  • IPC(Inter-Process Communication)을 사용한다. ->대부분의 IPC기법은 커널 공간을 이용한다.
  • LPC(Local inter-Process Communication)을 사용한다.
  • 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.

 

프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다.다음엔 스레드에 대해서 적어보겠다.

728x90

'Dev' 카테고리의 다른 글

DataBase Engine(데이터 베이스 엔진)  (0) 2021.09.28
프록시(Proxy)란  (0) 2021.07.26
객체 지향 프로그래밍(OOP)  (0) 2021.06.16
[Network]URL,URI,URN의 정의  (0) 2021.04.13
IntelliJ 단축키(MAC)  (0) 2021.03.11
728x90

🙉인터럽트란?

  • CPU가 프로그램을 실행하고 있을 때, 압출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 CPU에 알려서 처리하는 기술이다.
  • 인터럽트는 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다.

 

  • 하드웨어 인터럽트하드웨어가 발생시키는 인터럽트로, CPU가 아닌 다른 하드웨어 장치가 CPU에 어떤 사실을 알려주거나 CPU 서비스를 요청해야 할 경우 발생시킨다.
  • 하드웨어 인터럽트는 주로 전원 이상, 기계 문제,키보드등 IO 관련 이벤트 등이 있다.

 

  • 소프트웨어 인터럽트소프트웨어가 발생시키는 인터럽트이다. 소프트웨어(사용자 프로그램)가 스스로 인터럽트 라인을 세팅한다.(종류: 예외 상황,System Call)
  • 소프트웨어 인터럽트의 예로는 사용자 모드에서 허용되지 않은 명령 또는 공간에 접근을 하거나, 계산 결과가 Overflow/Underflow가 발생 할 때 등이 있다.
  • 인터럽트는 일종의 이벤트로 불린다. 이벤트에 맞게 운영체제가 처리를 한다.

 

🙈인터럽트가 필요한 이유

  1. 선점형 스케쥴러 구현

  • 프로세스 running중에 스케쥴러가 이를 중단 시키고, 다른 프로세스로 교체하기 위해, 현재 프로세스 실행을 중단 시킨다.
  • 현재 프로세스를 중단 시킬려면, 스케쥴러 코드가 실행이 되서 현재 프로세스를 중지 시켜야한다

2. I/O Device와의 커뮤니케이션

  • 저장매체에서 데이터 처리 완료시, 프로세스를 깨워야 한다.(Block state -> Ready state)

3. 예외 상황 핸들링 

  • CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생할 경우, CPU가 해당 처리를 할 수 있도록 CPU에 알려줘야한다.

🙉인터럽트 처리 예

1.CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치 이슈 발생

  • 파일 처리가 끝났다는 것을 운영체제에 알려준다.
  • 운영체제는 해당 프로세스를 Block State에서 실행 대기(ready) 상태로 프로세스 상태를 변경한다.

2.또는 예외 상황이 발생

  • 0으로 나누는 계산이 발생해서, 예외 발생을 운영체제에 알려준다.
  • 운영체제가 해당 프로세스 실행 중지/에러 표시를 한다.

 

728x90

'Dev > ComputerScience' 카테고리의 다른 글

[CS]스레드(Thread)란?  (0) 2021.06.15
[CS]Context Switching(컨택스트 스위칭)  (0) 2021.06.13
728x90

📖Context(Context)란?

CPU가 특정 프로세스를 실행시키기 위한 프로세스의 정보들이다.

Context는 프로세스의 PCB(Process Control Block)에 저장되어 Context Switching(컨택스트 스위칭)을 실행 할 때 PCB의 정보를 읽어 CPU가 이전에 프로세스가 하던 일을 이어서 수행 가능하다.

 

  👉PCB에는 다음과 같은 정보들이 저장된다.

  • 프로세스의 상태 : 생성,준비,수행,대기,중지
  • 프로그램 카운터 : 프로세스가 다음 실행할 명령어 주소
  • 레지스터 : 누산기,스택, 색인 레지스터 
  • 프로세스 번호

📖Context Switching(컨택스트 스위칭)이란?

멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서,인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때,실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트해서 메인 메모리에 저장하고, 다음 실행할 프로세스 정보를 메인메모리에 있는 해당 PCB정보를 CPU의 레지스터에 넣고. 실행하는 것이 Context Switching(컨택스트 스위칭)이다.

 

728x90

'Dev > ComputerScience' 카테고리의 다른 글

[CS]스레드(Thread)란?  (0) 2021.06.15
[CS]인터럽트(Interrupt)  (0) 2021.06.13