객체 지향 프로그래밍(OOP) 언어, JAVA

jiji·2023년 10월 14일
0

JAVA

목록 보기
1/9

🌱 JAVA

IDEA (IDE, Integrated[통합된] Development[발전] Environment[환경])

: 프로그래밍 언어를 지원하는 통합 개발 환경

  • 객체지향 언어 (OOP/ 추상화, 캡슐화, 상속, 다형성)
  • JVM 통해 여러 운영 체제에서 실행이 가능하나 (운영체제에 독립적이다)
    • 그래서 실행 속도가 상대적으로 느리다
  • 가비지 컬렉터를 통해 자동으로 메모리를 관리해준다
  • 오픈소스 라이브러리가 많다
  • 보안성 뛰어남

JVM 이란?

(Java Virtual Machine), 자바 가상 머신, 자바를 실행하기 위한 가상 기계(컴퓨터)
🕵🏻‍♀️ Java는 이 JVM 이라는 가상머신을 거쳐서 OS에 도달하기 때문에, JVM이 인식할 수 있는 Java bytecode(\*.class)로 변환된다.

Compiler
JDK를 설치하면 bin 에 존재하는 javac.exe (JDK에 포함되어 있다)
javac 명령어를 통해 .java를 .class로 컴파일 할 수 있다.

  • OS에 종속적이지 않다
  • 자바 프로그램이 실행되는 환경을 제공하는 소프트웨어 기반의 가상 머신이다.
  • 자바 바이트 코드(bytecode)를 실행해 다양한 플랫폼에서 동일한 자바 프로그램을 실행할 수 있도록 합니다.
    1. 자바 컴파일러에 의해 소스 코드 → 바이트 코드로 변환
    2. 이 바이트 코드는 JVM에 의해 실행되고, 해당 플랫폼의 기계어로 변환하여 실행한다.

GC 란?

(Garbage Collection)

🕵🏻‍♀️ C언어는 사용자가 직접 메모리를 할당하고 수동으로 해체를 해줘야한다. 이러한 상황에서 실수나 오류가 생기고 이러한 문제를 해결하기 위해 나타난 것이 가비지 컬렉션이다.

  • 메모리 관리 방법 중 하나이다.
  • 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능 한 자원으로 회수하는 것.
  • 가비지 컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.

C와 JAVA의 차이점

C
인간의 명령어를 컴퓨터가 수용할 수 있는 기계적 언어로 변환 시켜주는 역할을 한다. 시스템 간 호환 및 이식성이 좋고 고급 언어와 저급 언어 간의 인터페이스가 용이하다는 특징이 있다. 또한 절차 지향 프로그래밍의 대표적 언어로 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체 지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리하다.

  • 상대적으로 작고 빠르다 [절차]
  • 데이터 중심의 설계, 프로그램이 단계적으로 구성

Java
인터넷의 분산 환경에서 사용되도록 설계된 프로그래밍 언어이며 인터넷 환경 기반의 프로그램을 만들고 수행 시킬 수 있는 응용 프로그램을 만들 수 있다. 또한 객체 지향 프로그래밍의 대표적인 언어로 특징으로는 캡슐화, 상속, 다형성 등의 특성이 있다.

  • [객체] 기능 중심 설계, 데이터와 기능의 캡슐화 ⇒ 유지보수에 용이
  • JVM 통해 여러 운영체제에서 실행 가능

요약
절차 지향 언어 중 하나 인 C언어는 데이터 중심으로 설계하고, 프로그램이 단계적으로 구성됩니다. 상대적으로 작고 빠릅니다. 반대되는 개념인 객체지향 언어인 자바는 기능을 중심으로 설계되고, 데이터와 기능이 캡슐화 되어있어 유지보수에 용이합니다.

변수란?

하나의 값을 저장할 수 있는 공간

🌹 thread와 process

- 프로세스란 ?

실행 중인 프로그램의 인스턴스

  • 사용자가 작성한 프로그램이 운영체제(Windows, Linux, macOS)에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
    이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.
  1. 프로그램 인스턴스
    : 프로세스는 실행 중인 프로그램의 인스턴스입니다. 즉, 하나의 프로그램이 여러 개의 프로세스로 실행될 수 있습니다. 각 프로세스는 독립적인 메모리 공간을 가지며, 서로 간섭하지 않습니다.

  2. 독립성
    : 각 프로세스는 독립적인 실행 환경을 가집니다. 따라서 하나의 프로세스에서 예외 또는 오류가 발생하더라도 다른 프로세스는 영향을 받지 않습니다.

  3. 자원 할당
    : 프로세스는 운영 체제로부터 시스템 자원을 할당받습니다. 이러한 자원에는 CPU 시간, 메모리, 파일 디스크립터, 네트워크 연결 및 입출력 장치와 같은 것들이 포함됩니다.

  4. 스케줄링
    : 운영 체제는 여러 프로세스가 동시에 실행되도록 관리합니다. 이것을 프로세스 스케줄링이라고 합니다. 스케줄링은 각 프로세스가 CPU를 공정하게 사용하도록 조절하고, 우선 순위에 따라 실행을 조정합니다.

  5. 통신
    : 프로세스는 종종 서로 통신해야 합니다. 이를 위해 프로세스 간 통신(IPC) 메커니즘을 사용할 수 있으며, 이를 통해 데이터 및 메시지를 주고받을 수 있습니다.

프로세스는 멀티태스킹 운영 체제에서 여러 작업을 동시에 실행하는 기본적인 단위이며, 프로그램의 실행 상태와 컨텍스트 정보를 포함합니다. 프로세스가 생성되고 종료되는 동안 운영 체제는 이러한 프로세스를 관리하고 보호하여 시스템의 안정성과 효율성을 유지합니다.

- 스레드란 ?

프로세스 내에서 실제로 작업을 수행하는 주체.
모든 프로세스는 한 개 이상의 스레드가 존재하며, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.

장단점

장점

  • 사용자에 대한 응답성 향상
  • 자원 효율 (같은 프로세스 내에서 자원을 공유한다)
  • 동시성
  • 작업의 분리로 코드가 간결

단점

  • 스레드 중 한 스레드만 문제가 있어도, 전체 프로세스가 영향을 받는다. (상호 간섭)

  • 스레드를 많이 생성하면, Context Switching이 많이 일어나 성능이 저하된다.

    Context Switching란?
    - 작업의 주체가 현재 Context를 잠시 중단하고 다른 Context를 실행하는 것
    - 한 프로세스로 부터 CPU를 다른 프로세스로 넘겨주는 행동

    • 프로그래밍에서 Context동작, 작업들의 집합을 정의, 관리, 실행하도록 하는 최소한의 상태, 재료, 속성을 포함하는 객체, 구조체, 정보이다.
    • scheduling은 "자원"에 "작업"을 할당하는 행위이다.
  • 동기화 이슈 : 여러 스레드가 공유 자원에 동시에 접근할 때, 동기화 문제가 발생할 수 있다. 경쟁 상태(Race Condition) 무제는 스레드 간의 실행 순서나 타이밍에 따라 예측할 수 없는 결과가 발생할 수 있다.

    동기화란 ?
    작업들 사이에 실행 시기를 맞추는 것.

  • 자원 소비

🌱 객체 지향 언어의 특징

각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말합니다.
즉, 기능이 아닌 객체가 중심이며 "누가 어떤 일을 할 것인가?"가 핵심

💡 캡상추다!

  • 추상화 (지하철 노선도) : 필요한 정보를 간소화, 추상화
    - 객체의 공통적인 속성과 기능을 추출하여 정의한 것
    • 추상화를 구현할 수 있는 문법 : 추상클래스, 인터페이스
    • 어떤 객체가 수행해야 하는 핵심적인 역할만 규정해두고, 실제 구현은 해당 인터페이스를 구현하는 각각의 객체가 하도록 프로그램을 설계하는 것
  • 캡슐화 : 객체에 필요한 데이터나 기능을 그룹화 (은닉)
  • 상속 : 하위 - 가 상위 클래스의 기능을 사용하는 것
    • 중복 코드를 최소화 하고 코드의 재사용성을 증가 시킨다.
    • 오류를 줄이고, 개발 시간과 비용을 절감시켜준다.
      → 유지보수에 용이하다

지하철 노선도와 같이 실제를 객체화 하는것이 아니라 필요한 정보를 중심으로 간소화,추상화를 합니다. 그리고 데이터나 기능을 그룹화 시켜주는 것을 캡슐화라 합니다. 또 하위클래스가 상위클래스의 기능을 사용할 수 있게 상속을 통해 중복 코드를 재사용 할 수 있습니다.

이러한 특징들을 종합해서, 객체의 관계를 유연하게 해주는 다형성이 가장 중요한 특징입니다.

다형성 : 어떤 객체의 속성이나 기능이 상황에 따라 다른 역할을 수행할 수 있는 특성

OOP란?

객체 지향 프로그래밍 (Object-Oriented Programming, OOP)

객체 간의 상호작용으로 프로그램이 동작 하는 걸 말하고, 코드 재사용 가능, 오류 발생 가능성이 적고, 안정성이 높은 것이 장점이다.

다형성

  • 오버라이딩 (Overriding)
    : 상위 클래스의 메서드를 재정의
  • 오버로딩 (Overloading)
    : 한 클래스 내의 메서드 중복 정의 (다른 인자)

SOLID

1. SRP, 단일책임의 원칙

Single Responsibility Principle
작성된 클래스는 하나의 기능을 가지며 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는데 집중되어야 한다.

💡 즉, 변화에 의해 클래스를 변경하는 이유는 오직 하나여야 한다.

해당 모듈이 여러 대상 또는 액터들에 대해 책임을 가져서는 안되고, 오직 하나의 액터에 대해서만 책임을 져야 한다.

특징

  • 변경이 필요할 때 수정할 대상이 명확해진다.
  • 책임 영역 확실
  • 적절한 책임 분배로 코드의 가독성 및 유지 보수성 향상
  • 실제로 적용하기 어렵다. 실제 프로세스는 매우 복잡 다양하고 빈번하게 변경되기 때문에, 도메인에 대한 업무 이해가 부족하다면 SRP의 원리에서 멀어질 수 있다.
    • 많은 클래스 및 메서드가 생성 될 수 있다.
    • 과도한 분리시 서성능 저하 발생.

2. OCP, 개방-폐쇄 원칙

Open-Closed Principle
확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다

  • 인터페이스, 추상 클래스.. 사용해 새로운 기능은 추가하되 기존 코드는 수정하지 않도록.
  • 코드의 안정성, 확장성 향상.
  • 객체가 알아야하는 지식이 많으면 결합도가 높아지고, 개방-폐쇄의 원칙대로 설계하기 어려워진다.
    추상화를 통해 변하는 것은 숨기고 변하지 않는 것에 의존하도록 하자.

1) 추상화

개방 폐쇄 원칙을 지키기 위해서는 추상화에 의존해야 한다. 추상화란 핵심적인 부분만 남기고, 불필요한 부분은 제거함으로써 복잡한 것을 간단히 하는 것이고, 추상화를 통해 변하지 않는 부분만 남김으로써 기능을 구체화하고 확장할 수 있다. 변하지 않는 부분은 고정하고 변하는 부분을 생략하여 추상화함으로써 변경이 필요한 경우에 생략된 부분을 수정하여 개방-폐쇄의 원칙을 지킬 수 있다.

  • 런타임 의존성
    : 애플리케이션 실행 시점에서 객체들의 관계를 의미
  • 컴파일타임 의존성
    : 코드에 표현된 클래스들의 관계를 의미

런타임과 컴파일타임 차이점

3. LSP, 리스코프 치환 원칙

Liskov Substitution Principle

1988년 바바라 리스코프가 올바른 상속 관계의 특징을 정의하기 위해 발표한 것.

하위 타입은 상위 타입을 대체할 수 있어야 한다.
즉, 해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도, 차이점을 인식하지 못한 채 상위 타입의 퍼블릭 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다는 것이다.

  • 자식 클래스가 부모 클래스를 대체하기 위해서는 부모 클래스에 대한 클라이언트의 가정을 준수해야 한다는 것을 강조한다.
  • 대체 가능성을 결정해야 하는 것은 해당 객체를 이용하는 클라이언트이다.

상속 관계를 통해 이 원칙을 준수하고, 파생 클래스에서는 부모 클래스의 메서드를 오버라이딩하여 사용할 수 있다.

  • 코드의 재사용성 향상, 유연한 확장
  • 지나치게 많은 인터페이스, 추상 클래스 생성 시 복잡성 증가

4. ISP, 인터페이스 분리 원칙

Interface segregation principle
높은 응집도를 가지고 있더라도, 목적과 관심이 각기 다른 클라이언트에 있다면 인터페이스를 통해 적절하게 분리하자!

  • 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하자
  • 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스(외부에서 접근 가능한 메세지)만을 접근하여 불필요한 간섭을 최소화 한다.
public interface Area {
    double calculateArea();
}

public interface Volume {
    double calculateVolume();
}

// 면적만 계산
public class Rectangle implements Area {
    private double width;
    private double height;

    public double calculateArea() {
        return width * height;
    }
}

// 면적과 부피를 계산
public class Cube implements Area, Volume {
    private double width;
    private double height;
    private double depth;

    public double calculateArea() {
        return 2 * (width * height + width * depth + height * depth);
    }

    public double calculateVolume() {
        return width * height * depth;
    }
}

5. DIP, 의존 역전 원칙

Dependency Inversion Principle

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
  • 고수준 모듈
    : 입력과 출력으로부터 먼(비즈니스와 관련된) 추상화된 모듈
  • 저수준 모듈
    : 입력과 출력으로부터 가까운(HTTP, 데이터베이스, 캐시 등과 관련된) 구현 모듈

즉, 비즈니스와 관련된 부분(추상화)이 세부 사항에는 의존하지 않는 설계 원칙을 의미

추상클래스와 인터페이스의 차이

공통점 : 클래스의 추상화를 지원

추상 클래스
하나의 추상 메서드를 가지고 있거나, 일반 메서드를 가질 수도 있습니다

  • 상속을 받을 수 있음
  • 공통 부분을 추상화해 재사용하고, 다형성을 활용하기 위해서 사용

인터페이스
모든 메서드가 추상 메서드이고, 상수와 디폴트 메서드,스테틱 메서드만을 가지고 있습니다.

  • 클래스 간의 느슨한 결합을 통해 유연하고 확장가능한 구조를 만들기 위해 사용합니다.

🌱 IDEA

tool

  • 이클립스
  • 인텔리제이
    • 자동완성 기능이 더 잘된다고 생각 되어서 코드 작성하는데 더 편리함
      • 린팅 기능에 대해서?
    • 웹 개발 프레임워크(스프링, 스프링부트) 뿐만 아니라 java script 라이브러리(인) - 제이쿼리,리액트 등 다양하게 지원하는점

reference
https://mangkyu.tistory.com/194

0개의 댓글

관련 채용 정보