Tina

자바 공부

밍밍이

밍밍이

Sep 24, 2019

Collection

DataStructure를 직접 구현하지 않고 편하게 사용할 수 있는 구현체. 공간을 미리 산정하지 않아도 되고 객체의 수도 동적으로 정할 수 있다. 종류는 List, Map, Set, Stack, Queue가 있다.

Anotation

주석이라는 뜻이고 인터페이스를 기반으로한 문법이다. 주로 메소드를 오버라이드 할 때 쓰이는 @Override가 그 예이다. 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입하고 실행되는 시점을 조절하기 위해 사용한다.

Generic

제네릭은 다양한 타입의 객체를 다룰 때 컴파일 과정에서 객체의 타입체크를 해주도록 도와주는 기능이다. 예를 들면 Collection에 특정 객체만 추가될 수 있도록 하는 것이 있다.

Final Keyword

  • class : 다른 클래스에서 상속 불가
  • method : 다른 메소드에서 오버라이딩 불가
  • var : 변하지 않는 상수값이 되어 새로 할당할 수 없다.

Overload

상위 클래스의 메소드 이름과 리턴값은 동일하지만 매개변수만 다른 메소드를 만드는 것. 이를 통해 다양한 상황에서 메소드가 실행될 수 있도록 한다.

Access Modifier

변수 또는 메소드의 접근 범위를 설정하는 자바의 예약어

  • default : 클래스가 정의되어 있는 해당 패키지 내 접근 가능
  • public : 어떤 클래스에서도 접근 가능
  • private : 정의된 해당 클래스에서만 접근 가능
  • protected : 정의된 해당 클래스 내, 해당 클래스를 상속받은 클래스 내 접근 가능

Wrapper class

기본 자료형에 대한 클래스 표현. 즉 Integer, Float, Boolean 등으로 사용하는 것이다. 이렇게 사용하는 이유는

  • Collection에서 제네릭을 사용하기 위해
  • null값을 반환해야만 하는 경우. return type을 Wrapper Class로 지정해 null값을 반환 할 수 있다. 그러나 이러한 경우가 아니라면 불편한 상황이 많기 때문에 Primitive data type을 사용하는 것이 바람직하다. 예로 비교할 때 Primitive data type인 경우 ==으로 비교하지만 Wrapper Class인 경우 .intValue() 메소드로 비교해야 하는 불편함이 있다.

AutoBoxing

JDK 1.5 부터는 지원하는 기능. 이 기능은 각 Wrapper Class에 상응하는 Primitive data type일 경우에 가능

List<Integer> list = new ArrayList<>();
list.add(1);

위와 같이 1을 Integer 객체로 감싸서 넣지 않는다. 자바 내부에서 AutoBoxing 해주기 때문이다.

Process

실행되고 있는 프로그램의 개체.

Thread

프로세스 안에 존재하여 프로세스의 자원을 공유하는 개체.

Field member

필드는 클래스에 변수를 정의하는 공간. 이곳에 변수를 만들어두면 메소드끼리 쉽게 참고할 수 있어서 편리하다. 그러나 객체가 여러 스레드에 접근하는 싱글톤 객체라면 필드에 변수를 선언하는 방법 대신 모든 변수를 파람으로 받아 리턴하는 방식으로 코드를 구성해야 한다.

Synchronized

스레드가 하나의 자원을 공유함에 따라 데이터의 일관성 문제가 생기는데 이를 통해 하나의 스레드만 접근할 수 있도록 함.

ThreadLocal

스레드 간 간섭이 없어야 하는 데이터레 사용한다. 멀티스레드 환경에서는 클래스의 필드에 멤버를 투가할 수 없고 매개변수로 넘겨 받아야 하기 때문이다. 즉, 스레드 내부의 싱글톤을 사용하기 위해 사용한다. 주로 사용자 인증, 세션 정보, 트랜잭션 컨텍스트에 사용한다. 스레드 풀 환경에서 이를 사용할 경우 ThreadLocal 변수에 보관된 데이터 사용이 끝나면 반드시 해당 데이터를 삭제해주어야 한다.

자바의 데이터 타입

  • 정수형 : byte, short, int, long
  • 실수형 : double, int
  • 그외 : boolean, reference(기본형을 제외한 타입, 참조값을 통해 해당 객체에 직접 접근 가능)

뮤텍스

스레드 간 통신 시 shared memory 등을 쓰는 경우 하나의 자원에 두 개 이상의 프로세스 혹은 스레드가 접근하는 경우 사용된다. 상호배제라고도 하며 Critical Section을 가진 스레드의 Running timee이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술.

세마포어

프로세스에서 통신 시 뮤텍스 말고 세마포어를 사용한다. 리소스 상태를 나타내는 간단한 카운터 공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있음.

스레드 구현 방법

  • Runnable 인터페이스 구현 : run 함수를 반드시 구현 후 Thread 생성자의 매개변수로 입력.
  • Thread 클래스 상속 : Thread 클래스를 상속 받아서 구현.

Static

인스턴스 변수 또는 인스턴스 메소드를 클래스 변수 혹은 클래스 메소드로 변경시킴. 모든 인스턴스 간 공유하는 변수 혹은 메소드가 된다.

클래스와 인스턴스의 차이

클래스에서 정해진 기능과 모양에 맞추어 인스턴스가 생성됨

객체지향과 절차지향

  • 객체지향 : 개발하려는 기능을 묶어 모듈화, 모듈을 재활욜하기 때문에 같은 기능을 반복적으로 연산하지 않고 사용률이 높음. 업그레이드가 쉽고 디버깅이 쉬움. 절차지향에 비해 상대적으로 속도가 느림.
  • 절차지향 : 순차적인 처리가 중요시 됨. 프로그램 전체가 유기적으로 연결되어 있어 하나의 코드 변경이 전체에 영향을 미칠 수 있음. 코드 사이즈를 최소화하고 가장 빠르게 동작하는게 우선이면 절차지향 프로그래밍 언어를 사용하는 게 좋음.

자바와 C언어

  • 자바는 One Source, Multi Use (소스 하나를 가지고 자바를 설치할 수 있는 플랫폼이라면 어떤 플랫폼에서도 소스 변경없이 사용 가능)
  • 메모리 관리를 JVM 내 GC를 통해 이루어지므로 시스템 안정성이 높음.
  • C언어에 비해 성능이 떨어짐.

OPP

  • 캡슐화 : 객체 외부에서 객체 내부 정보를 직접 접근하거나 조작할 수 없고 외부에서 접근할 수 있도록 정의된 메소드를 통해서만 관련 데이터에 접근할 수 있음. 내부 정보가 은폐되어 변경이 발생할 때 오류 발생이 적으며 재사용이 용이함.
  • 상속 : 이미 작성된 클래스를 이어받아 새로운 클래스를 생성하는 기법. 코드의 재사용성이 높아짐.
  • 다형성 : 하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 특성
Tiger tiger = new Tiger();
Animal animal = new Tiger();
Living living = new Tiger();

다형성이 없다면 각 클래스 별로 연산을 해주어야 하지만 다형성으로 인해 하나로 묶을 수 있어 편리함.

추상 클래스와 인터페이스

  • 인터페이스 : 클래스가 아닌 다른 구조체 사용. 다중 상속이 가능하고 구현을 명시한 클래스에서는 반드시 구현해야 함. 껍데기만 표현되어 있음.
  • 추상클래스 : 한 개 이상의 추상 메소드를 가진 클래스. 다중 상속이 불가능하고 클래스 앞에 abstract가 붙는다. 구현이 강제되지 않는다.

인스턴스, 전역, 로컬 변수

  • 전역/클래스 변수 : 모든 인스턴스가 공통된 영역을 공유함. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 경우에 클래스 변수로 선언
  • 인스턴스 변수 : 클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어짐. 인스턴스는 독립적인 저장공간을 가지므로 인스턴스 변로 서로 다른 값을 가질 수 있음.
  • 지역 변수 : 메서드 내에 선언되며 메서드 내에서만 사용가능. 메서드가 종료되면 변수는 소멸됨.