지수코딩 2019. 9. 24. 15:27

jdk(java development kit): jre의 상위, java.c.exe로 실행(컴파일러), 자바 디버깅 프로그램

jre(): 라이브러리, JVM, 애플리케이션 실행시 필요한 컴포넌트 포함

  • 객체지향 프로그래밍은 클래스, 객체, 상속, 캡슐화, 추상화, 다형성과 같은 개념들과 관련이 있는 프로그래밍 스타일
  • 객체지향 프로그래밍 패러다임을 따르는 유명한 프로그래밍 언어로는 Java, V++, V#, Ruby 등
  • 프로그램의 구조를 객체 간 상호작용 관계로 표현하는 프로그래밍 방식
  • 자바에서 객체 기반 애플리케이션은 클래스 선언, 객체 생성, 그 객체들 사이의 상호작용에 기반을 두고 설계 됨

클래스

  • 공통적으로 갖는 속성들을 모아서 정의내린 것, 연관되어 있는 변수와 메소드의 집합
  • 사용자가 정의한 생성될 객체의 청사진 혹은 프로토타입
  • 클래스의 선언은 다음과 같은 컴포넌트들을 포함할 수 있음
    • 접근 제어자: 클래스는 public 혹은 default
    • 클래스 명은 대문자로 시작
    • 부모클래스가 있는 경우 extends 키워드를 사용하여 오직 하나의 부모클래스만 적용
    • 인터페이스를 구현한 경우 implements 키워드를 사용하여 여러 개를 적을 수 있음
    • body는 중괄호로 감싸져 있음
    • 생성자는 새로운 객체를 초기화할 때 사용됨

제어자

  • 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드

    • 접근 제어자: public, private, default(같은 패키지에 있는 클래스에 의해서만 접근 가능), protected(같은 패키지, 서브 클래스에서 접근 가능)
    • 기타 제어자: final(다른 클래스에 의해 상속X), static(), abstract, transient

    final, abstract → 클래스에 사용할 수 있는 기타 제어자

    final(속성 변경X, 메소드 overrideX), static(속성과 메소드는 객체가 아니라 클래스에 속하게 됨), abstract, transient(객체의 직렬화 시 이 키워드를 포함한 속성과 메소드는 스킵됨) → 속성, 메소드

캡슐화

  • 객체지향 프로그래밍의 토대가 되는 4가지 개념 중 하나

    ⇒ 4가지 개념: 상속, 다형성, 추상성, 캡슐화

  • 데이터(변수)와 데이터에서 작동하는 코드를 하나의 단위에 함께 묶어놓는 매커니즘

  • 클래스의 변수를 다른 클래스로부터 숨기고, 오직 클래스의 메소도를 통해서만 접근할 수 있게 함

  • 데이터 은닉화라고도 함

  • 클래스 변수를 private으로 선언하고, getter와 setter 메소드를 제공

Q: 캡슐화는 왜 사용하는가?

A: 클래스의 필드들을 read-only write-only로 만들 수 있음

생성자

  • new 키워드를 사용하여 클래스로부터 객체를 생성할 때 실행되는 특별한 메소드
  • 새로운 객체를 만들기 위해서 생성자를 호출하면 메모리에 객체를 위한 공간 생성 및 필드 초기화
  • 가긱 다른 인자 리스트를 가진 생성자를 여러 개 선언할 수 있음
  • 자바 플랫폼은 생성자의 인자 개수와 타입에 기반하여 생성자를 구별
  • 한 클래스를 위한 같은 개수와 타입의 인자를가진 두 개의 생성자는 만들 수 없음

Q: 생성자는 필수로 만들어야 할까?

A: 클래스를 위한 생성자 제공은 필수가 아님

컴파일러는 생성자가 없는 클래스를 위해 자동으로 인자가 없는 디폴트 생성자를 제공

⇒ 이 디폴트 생성자는 슈퍼클래스의 아무런 인자도 없는 생성자를 호출

Q: 생성자를 private으로 선언하면 어떤 일이 나타날까?

A: private으로 선언한 생성자로 객체를 생성할 수 없음

객체를 생성할 필요가 없는 utility 클래스의 경우 default 생성자를 private으로 정의하여 의도적으로 해당 클래스로붵 객체를 생성할 수 없도록 하기도 함

인스턴스

  • new 연산자는 새로운 객체를 위한 메모리를 할당하고 그 메모리에 참조를 반환함

    = 클래스를 인스턴스화 함

  • 클래스를 인스턴스화한다 = 객체를 생성한다

  • 객체를 생성하면 클래스의 인스턴스를 만들게 된다

Q: 인스턴스와 객체의 관계는?

A: 인스턴스와 객체는 동일한 의미

다만, 객체는 인스턴스를 상위 포괄하는 개념

객체 = 클래스의 인스턴스

메소드

  • 작업을 수행하기 위해 함께 그룹으로 묶인 표현들(statements)의 모음
  • 메소드 선언의 6가지 요소
    1. 접근 제어자: public, private, ", protected
    2. 리턴 타입: 메소드에 의해 반환되는 값의 데이터 유형, 혹은 return value가 없으면 void
    3. 메소드명: 코드 관습에 따르면 소문자의 동사로 시작하며 형용사 명사 순으로, 단어의 시작은 대문자로 함
    4. 괄호/파라미터 리스트: 괄호 안에 쉼표로 구분된 파라미터의 리스트
    5. 익셉션 리스트
    6. 중괄호로 감싼 메소드 body

오버로딩

  • 같은 이름의 메소드를 파라미터 리스트만 달리하여 선언할 수 있음
  • 컴파일러는 오로지 시그니처로 메소드 구분

메소드 시그니처

  • 메소드 이름과 파라미터 타입

정적 메소드

  • 클래스의 인스턴스가 필요하지 않은 경우, static 키워드를 사용하여 메소드를 선언하면 클래스의 인스턴스 없이 메소드를 실행할 수 있음

Q: 예외가 발생할 때 언제나 try catch를 써야할까?

A: 상황에 따라 오히려 마이너스가 될 수 도 있음

메소드A에서 다른 메소드들을 호출하는 경우 가정

메소드A에 공통으로 try catch 처리가 되어있는데, 호출되는 메소드들에도 try catch 처리가 되어 있다면?

때때로 throws 키워드로 예외를 던질 때도 필요함

상속

  • 상속은 한 클래스의 속성을 다른 클래스에서 상속받을 수 있다는 하나의 개념
  • 코드의 재사용과 클래스들간의 관계를 정립하는 데 에 도움을 줌
  • 자식은 부모로부터 속성을 물려받듯, 자식클래스는 부모클래스의 속성들을 상속 받음
  • extends 키워드를 사용
  • 상속의 종류는 단일, 다중, 다층, 계층, 혼합이 있음

구성(composition)과 위임(delegation)

  • 구성은 클래스가 다른 클래스를 인스턴스 변수로 가진다.
  • 위임은 인스턴스 변수를 통해 메소드 호출하는 것
  • 구성은 상속의 대체 수단이 될 수 있음
  • 상속보다 위임이 나은 점은 새로운 클래스를 만들어서 부모 클래스의 모든 메소드를 받아들이는 것을 강제하지 않기 때문에 오직 필요한 메소드만 제공하면 됨
  • 실행 시 동적으로 타입을 선택할 수 있으므로 유연

다형성

  • 다형성은 '다양한 형태'라는 의미로, 상속으로 인해 서로 관계가 있는 클래스를 만들 때 발생됨

  • 상속을 통해 속성과 메소드를 다른 클래스로부터 상속받아 다른 일을 수행하는 메소드로 사용

    ⇒ 하나의 액션을 여러 가지 방식으로 수행할 수 있게 함

  • 상속과 메소드 오버라이딩을 통해 다형성을 실현할 수 있음

추상클래스

  • abstract로 선언된 클래스
  • 추상 메소드를 포함할 수 도 아닐 수 도 있음
  • 인스턴스화 불가
  • extends 기워드를 통해 상속되며, 자식 클래스는 오직 하나의 추상클래스를 상속 받을 수 있음
  • 상속받는 자식 클래스가 추상클래스가 아니라면 추상 메소드의 구현부를 모두 제공해야 함

인터페이스

  • 오직 추상 메소드만을 가지고 있는 완전한 추상 클래스
  • 인스턴스화 불가
  • implements 키워드를 통해 구현되며, 여러 개의 인터페이스를 구현할 수 있음
  • 인터페이스를 구현하기 위해서는 인터페이스가 가지고 있는 모든 메소드를 오버라이드 해야 함
  • 인터페이스의 메소드는 디폴트로 abstract, public
  • 인터페이스의 변수는 디폴트로 public, static, final
  • 생성자를 가질 수 없음

Q: 어떨 때 추상클래스를 사용하고, 어떨 때 인터페이스를 사용해야 할까?

A: 추상클래스 사용을

static

  • 주로 메모리 관리를 해서 사용됨
  • 변수, 메소드, 블록, 중첩 클래스에 사용될 수 있음
  • 클래스의 인스턴스보다는 클래스에 속함

static 메소드

  • 메소드에 사용하면 static 메소드가 됨
  • static 메소드는 클래스의 객체보다는 클래스에 속하게 됨
  • 클래스의 인스턴스를 생성할 필요 없이 메소드가 실행됨
  • static 메소드는static 데이터에 접근할 수 있으며 값을 변경할 수 있음

static 블럭

  • static 멤버 변수를 초기화하는 데에 사용됨
  • 클래스 로딩 시에 메인 메소드가 실행되기 전에 실행됨

SOLID(객체지향 개발 5대 원리)

  1. SRP(단일책임의 원칙)
    • 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다는 원칙
    • 이는 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함
    • SRP원리를 적용하면 무엇보다도 책임 영역이 확실해지기 때문에 한 책임의 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로워짐
    • 임을 적절히 부배함으로써 코드의 가독성 향상, 유지보수 용이 이점
  2. OCP(Open Close Principle)
    • 소프트웨어의 구성요소는 확장에는 열려있고, 변경에는 닫혀있어야 함
    • 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 함
    • 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 함
    • 관리가능하고 재사용 가능한 코드를 만드는 기반
    • OCP를 가능케 하는 중요 매커니즘은 추상화와 다형성
  3. L~~
  4. ISP
  5. DIP

Q: String 객체를 생성할 때 new 키워드를 사용하는 것과 리터럴로 선언하는 것의 차이점?

A: 직접 할당하면 String Constant Pool이라는 곳에 저장됨

new String("~~")은 heap 메모리에 별도로 객체 생성됨

메모리의 효율적 관리를 위해서 리터럴 선언 선호

java.lang 패키지

  • 변경될 수 있는 문자들의 sequence
  • 여러 개의 쓰레드에 의한 사용도 안전
  • 주요 메소드는 append와 insert로 어떤 타입이라도 받아들일 수 있도록 오버로드 되어있음

StringBuffer

StringBuilder

java.lang 패키지

  • 각종 정보를 확인할 수 있는 클래스
    • 시스템 속성 값 관리
    • 시스템 환경 값 조회
    • GC 수행
    • JVM 종료
    • 현재 시간 조회
  • 생성자가 없음
  • 변수와 메소드 모두 static으로 선언되어 있음

컬렉션 프레임워크

  • 객체들의 그룹을 표현하기 위한 객체인 컬렉션을 표현하고 조작하기 위한 통일된 아키텍처
  • 데이터 구조와 알고리즘을 제공함으로써 직접 코드를 짤 필요가 없어 프로그래밍 노력을 감소시킴
  • 데이터 구조와 알고리즘에 대한 성능을 높이기 위해 사용(???)

컬렉션 프레임워크 List

  • class ArrayList<E>

    • 크기 확장이 가능하며 배열처럼 순서가 있음
    • Vector 클래스와 거의 유사하지만 Thread safe하지 않음
    • 각 ArrayList 인스턴스는 용량을 가지고 있음
    • 용량은 언제나 적어도 리스트 사이즈보다는 크며, 요소가 추가되면 용량은 자동으로 증가
    • 필요한 사이즈를 알 경우, 생성자에 파라미터로 사이즈는 int 타입으로 넘길 수 있음

    ⇒ 사이즈 재할당 작업을 줄일 수 있음

컬렉션 프레임워크 Set

  • calss HashSet<E>

    • 순서에 상관 없이, 어떤 데이터가 존재하는지를 확인하기 위한 용도로 많이 사용됨
    • 중복을 방지
  • class ArrayQueue<E>

  • class ArrayDeque<E>

    • 인터페이스를 리사이징 가능한 배열
    • 용량 제한 없음
    • 필요한 만큼 용량 증가
    • thread-safe하지 않음
    • Queue로 사용할 때 LinkedList보다 빠름
    • index로 조작하는 기능 제공 안함
  • class HashMap<K,V>

    • 모든 데이터는 키-값 한 쌍으로 저장
    • key는 map에서 고유해야만 함
    • 같은 key값으로 데이터를 추가하면 마지막에 넣은 값으로 저장

프로세스와 쓰레드

  • 프로세스란 자기 자신만의 주소 공간을 갖는 독립적인 실행 프로그램
  • 쓰레드란 프로세스 내의 독립적인 순차흐름 또는 제어, 경량 프로세스
  • class를 실행하면 JVM이 시작되고, JVM이 시작되면

Thread와 Runnable

Thread

  • 쓰레드를 생성하는 방법 중 하나는 Thread 클래스를 사용하는 것
  • 다른 클래스를 확장할 필요가 없을 때 Thread를 사용하는 것이 편함
  • 쓰레드 시작 메소드는 start()이며, start 메소드를 호출하면 run() 메소드를 수행하도록 되어있음

Runnable

  • 쓰러데르르 생성하는 또 다른 방법은 Runnable 인터페이스를 사용하는 것
  • 다중 상속의 문제가 있어서 쓰레드를 확장할 수 없을 때, 러너블 구현
  • start()로 바로 실행할 수 없음
  • 쓰레드 생성자에 파라미터로 객체를 넘겨서 실행해야 함
반응형