CS공부 2(자바)

RedNine·2023년 9월 22일
0

cs공부

목록 보기
2/10
post-thumbnail

🍳 자바 애플리케이션 실행 과정

  • java로 프로그래밍된 파일을 java컴파일러가 java클래스 파일로 만든다. 소스코드를 java바이트 코드로 번역한 후에 java바이트 코드를 JVM이 읽고 실행한다.
  • 자바 바이트 코드의 확장자는 .class이며, 자바 바이트 코드는 자바 가상머신만 설치되어 있다면 어떤 운영체제에서든지 실행될 수 있다.
  • 참고url : [JAVA] 자바 프로그램 실행 과정 및 기본 구조

🎈자바가상머신(JVM)

  • JVM은 Java 클래스 파일을 로드하고 바이트 코드를 해석하여 메모리 등의 자원을 할당하고 관리하며 처리하는 작업을 하는 프로그램이다.

자바가 실행되는 과정은?
1. 컴파일러가 자바 소스를 바이트코드로 변환한다.
2. Class Loader가 바이트 코드를 런타임 데이터 영역에 로드시킨다.
3. 로딩된 바이트 코드가 실행엔진에 의해서 실행되게 된다.

🎈 자바 메모리 구조

스레드별 : PC Register, JVM Stack, Native Method Stack
공통 : Method Area, Heap

( 스레드별 )

  • PC Register : 현재 수행 중인 JVM명령의 주소 값이 저장된다.
  • JVM Stack : 호출된 메소드의 매개변수, 지역변수, 리턴정보들이 저장된다.
  • Native Method Stack : 자바 외의 언어인 C나 C++ 같은 것들을 수행하기 위한 영역이다.

( 공통 )

  • Heap : 런타임중 생성되는 객체들이 동적으로 할당되는 곳이다.
  • Method Area : 클래스 별로 전역변수, 정적변수, 메소드 정보들이 저장되게 된다.

자바 메모리 구조는?
스레드별 PC Register, JVM Stack, Native Method Stack이 있고, 공통 스레드는 Method Area, Heap이 있다.

🍳 가비지 컬렉션(GC)

프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해주어야 하지만, Java나 Kotlin을 이용해 개발을 하다 보면 개발자가 메모리를 직접 해제해주는 일이 없다. 그 이유는 JVM의 가비지 컬렉션이 불필요한 메모리를 알아서 정리해주기 때문이다.

가비지 컬렉션(GC)이 동작하는 동안에는 JVM의 다른 동작들은 잠깐 멈추기 때문에 오버헤드가 발생한다. 이로 인해 가비지 컬렉션이 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다. 이러한 특성으로 인해 실시간으로 계속 동작해주어야 하는 시스템들은 가비지 컬렉션의 사용이 적합하지 않을 수 있다.

  • Mark : Root로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 잠조하고 있는지 찾아서 마킹한다.
  • Sweep : 참조하고 있지 않은 객체인 Unreachable 객체들을 Heap에서 제거한다.

가비지 컬렉션이란?
JVM에서 메모리를 관리해주며, Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈이다. 개발자가 직접 메모리를 정리하지 않아도 되어서 개발속도가 향상되는 장점이 있지만 Mark and Sweep이라는 과정에서 참조되지 않는 객체를 찾는 과정이 있는데, 이때 스레드가 잠깐 중단되어서 성능이 떨어진다는 단점이 있다.

🍳 객체지향 프로그래밍

🎈객체지향 프로그래밍(OOP)

프로세스 중심이 아닌 객체중심으로 프로그래밍으로 구현하는 것이다. 순서, 과정이 중요하지 않다. 이해하기 쉽고 모듈화가 쉬우며, 재사용이 가능하다. 현실 세계의 사물같은 객체를 만들고, 객체에서 필요한 특징을 뽑아 프로그래밍을 수행한다. 대표적으로 Java, Python, C++ 등이 있다.

🎁 객체지향 프로그래밍 특징

🎨 추상화(Abstraction)

클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현하는 것이다.

🎨 캡슐화(Encapsulation)

데이터와 코드의 형태를 외부로부터 알 수 없게 하고(정보은닉), 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법이다. 즉, 정보은닉을 통해서 내부적으로 높은 응집도를 가지고 외부에서는 낮은 응집도를 가진다.

  1. 멤버 변수 앞에 접근 제어자 private를 붙인다.
  2. 멤버 변수에 값을 넣고 꺼내 올 수 있는 메서드를 만든다.
    (접두어 set/get을 사용해 메서드를 만든다.)

🎨 상속성(Inheritance)

부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것이다.

🎨 다형성(Polymorphism)

다양한 객체를 동일한 인터페이스 또는 부모 클래스로 다룰 수 있도록 하는 개념이다. 실행 시에 객체의 실제 타입에 따라 동작이 결정된다.

오버로딩(Overloadding)
메서드명을 하나로 통합할 때 매개변수 갯수와 자료형을 가지고 서로 다른 메서드 처럼 사용할 수 있게 만드는 기법이다.

  • 생성자 오버로딩

    다양한 방법으로 멤버변수의 값을 초기화 및 저장시킬 수가 있다. 생성자 내부에서는 자기 클래스의 객체명을 사용할 수 없고, 다른 클래스의 객체명은 사용할 수 있다. 객체명.일반메서드명(~)

  • 메서드 오버로딩

    메서드의 이름은 같아야 한다. 메서드의 매개변수를 다르게 설정하더라도 서로 자료형이 달라야된다. 메서드의 자료형을 다르게 설정해야 한다.

오버라이딩 (Overriding)
부모의 물려받은 메서드를 자식클래스 내부에 맞게 재정의하는 기법이다. 매개변수와 리턴 타입이 같아야 한다.

  • 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것이다. 자식 클래스에서 오버라이드된 메서드는 부모 클래스의 메서드 대신 호출된다.
  • 오버라이딩은 상속 관계에서 발생하며, 부모 클래스와 자식 클래스 간에 동일한 메서드 시그니처(이름, 파라미터 유형 및 개수)가 있어야 한다.

객체지향 프로그래밍은?
객체지향 프로그래밍은 프로세스 중심이 아닌 객체중심으로 프로그래밍으로 구현하는것이다. (재사용 가능)

객체지향 프로그래밍의 4가지 특징은 추상화, 캡슐화, 다향성, 상속성이 있다.

  • 추상화는 클래스들의 공통적인 특성들을 묶어 표현하는 것이다.
  • 캡슐화는 데이터를 보호, 은닉하는 목적으로 사용한다.
  • 상속성은 부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것이다.
  • 다형성은 하나의 타입에 여러 객체를 대입할 수 있는 성질이다.

✨ 절차지향 프로그래밍

일을 처리하는 순서, 과정을 프로그래밍으로 구현한 것이다. 대표적으로 C언어가 해당된다. 절차에 맞게 차례대로 진행되다 보니 속도가 빠르다는 장점이 있지만 유지보수가 어렵다는 단점이 있다.

절차지향 프로그래밍은?
절차지향 프로그래밍은 일을 처리하는 순서, 과정을 프로그래밍으로 구현하는것이다. (재사용 불가)

🍳 추상클래스 vs 인터페이스

추상 클래스와 인터페이스는 객체 지향 프로그래밍(OOP)에서 다형성(Polymorphism)을 구현하기 위한 두 가지 주요 방법 중에 하나를 선택하는 데 사용되는 요소이다.

🎈 추상클래스

추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스이다. 추상 메서드를 선언하여 상속을 통해서 자식 클래스에서 완성하도록 유도하는 클래스이다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다. class 앞에 "abstract" 예약어를 사용하여 상속을 통해서 구현해야한다는 것을 알려주고 선언부만 작성하는 추상메서드를 선언할 수 있다. 다중 상속이 불가능하여 단일 상속만 허용하며, 같은 추상화인 인터페이스와 다른점은 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.

  • 추상 클래스는 일부 메서드를 구현하고 나머지 메서드를 하위 클래스에서 구현하도록 강제한다.
  • 추상 클래스는 abstract 예약어를 사용하여 선언되며, 객체를 직접 생성할 수 없다.
  • 추상 클래스는 일반 메서드와 추상 메서드를 모두 포함할 수 있다.
  • 하위 클래스는 추상 클래스의 추상 메서드를 반드시 구현해야 한다.

🎈 인터페이스

추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능하다. 내부의 모든 메서드는 public abstract 로 정의(default 메소드 제외)한다. 클래스에 다중 구현을 지원하며, 인터페이스 끼리는 다중 상속을 지원한다. 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점을 두었다.

  • 인터페이스는 일련의 추상 메서드를 정의하는 것으로, 클래스가 해당 인터페이스를 구현하도록 강제한다.
  • 클래스에서 여러 인터페이스를 동시에 구현할 수 있다.
  • 인터페이스는 모든 메서드가 추상 메서드이며, 필드는 상수만 가질 수 있다.

추상클래스와 인터페이스란?
추상클래스는 abstract 지시자로 정의되며 추상메소드가 하나 이상 포함된다. 인터페이스는 interface 지시자로 정의하며 모든 메소드가 추상메소드로 정의한다.

추상클래스와 인터페이스의 차이점은?
추상클래스와 인터페이스의 차이는 그 존재의 목적에 있다. 추상클래스는 상속받아서 기능을 재활용하고 확장시키는데 목적이 있다면, 인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는것을 보장하는 것에 그 목적이 있다.

0개의 댓글