SMALL

자바는 다중 상속은 허용하지 않는다.


다중 상속을 허용하면 부모 객체가 누구인지 혼동이 온다. 이것을 다이아몬드 문제라고 말한다.



class 회장 {

public void execute() {

System.out.println("회장");

};

};


class 회장의왼팔 extends 회장{


@override

public void execute() {

System.out.println("회장의왼팔");

};

};


class 회장의오른팔 extends 회장{


@override

public void execute() {

System.out.println("회장의오른팔");

};

};


class 부하직원 extends 회장의왼팔, 회장의오른팔 {


@override

public void execute() {

super.execute(); (?)

};

};

위의 사진과 코드를 보면 부하직원이 왼팔과 오른팔을 상속 받으면 누구의 말을 들을지 모른다.. 


하지만 인터페이스는 다중 상속이 되는걸 볼수 있다.

왜냐하면,, 인터페이스는 선언만 하고 구현을 하지 않으니 가능하다..


ps. 자바8이상에서는 인터페이스에서 default로 매서드를 선언하게 된다면 구현을 할 수있게 된다. 그렇게된다면 위와 같은 오류가 생기게 된다.



LIST

'전공 > JAVA' 카테고리의 다른 글

String, StringBuffer, StringBuilder 차이  (0) 2020.07.02
JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
SMALL

JAVA 코딩을 하다보면 String과 StringBuffer을 많이 보게 된다.


String은 우선 불변이다. 그래서 값의 변동이 없을때 사용하면 좋다. 이게 무슨 의미냐면


String a = "NOIL";

a = "PARKNOIL";



위의 그림을 보면 기존의 PARK는 사용되지 않고 메모리 낭비가 되고 GC처리대상이 된다.


하지만,


StringBuilder a = new StringBuilder("PARK");

a.append("NOIL");





위의 그림을 보면 메모리 낭비가 없음. 


StringBuffer랑 StringBuilder의 가장 큰 차이는 동기화를 지원하느냐이다. 

StringBuffer은 동기화 지원하기에 멀티 쓰레드 환경에 사용하면 적절, 하지만 싱글 쓰레드 환경 및 동기화가 필요없다면 StringBuilder을 사용하는게 성능적으로 더 좋다.


그래서 보통 싱글 어플리케이션 개발을 할 때는 StringBuilder을 사용하는게 좋고, 습관화 하자..

















LIST

'전공 > JAVA' 카테고리의 다른 글

다중상속 문제점  (0) 2020.07.03
JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
SMALL

JNI(Java Native Method)


java는 jvm 위에서 실행 되기때문에 os 영향을 받지 않음.

하지만 jvm이 운영체제의 모든 기능을 사용할순 없음.

그래서 c언어에서 직접 구현해서 java에서 불러와서 사용할수있게 하는작업이 JNI라고 한다..


예제는 다른 블로그에도 많으니 참고하자.


ps. K은행 필기 문제로 나와서 정리.

LIST

'전공 > JAVA' 카테고리의 다른 글

다중상속 문제점  (0) 2020.07.03
String, StringBuffer, StringBuilder 차이  (0) 2020.07.02
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
SMALL

JAVA 7에 try-with-resource가 생겼다.

try-with-resource는 간단히 말하면 자원을 자동으로 해제 처리를 해주는 것이다.

아래의 코딩을 보면서 설명을 하겠다.


try finally (기존)



위의 코드는 기존에 DB 커넥션을 다 사용하면 finally에서 직접 자원을 해제를 해주어야 했다.


try-with-resource


위와 같이 try () 안에 자원을 초기화만 해주면 알아서 try 구문이 끝나면 finally 필요 없이 자원이 자동으로 해제된다.





LIST

'전공 > JAVA' 카테고리의 다른 글

String, StringBuffer, StringBuilder 차이  (0) 2020.07.02
JNI  (0) 2020.06.24
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
접근제어자  (0) 2018.05.02
SMALL

컬렉션(Collection)


자바에서 데이터를 저장하는 기본적인 자료구조를 모아서 편하게 사용하기 위해 컬렉션을 제공한다.




인터페이스

구현 클래스

특징

List

LinkedList

Stack

Vector

ArrayList 

순서가 있는 데이터의 집합이고, 데이터 중복을 허용 

Set

HashSet

TreeSet

순서가 없는 데이터의 집합이고, 데이터 중복을 허용하지 않는다. 

Map

HashMap

TreeMap

HashTable

Properties

키와 값의 쌍으로 이루어진 데이터의 집합이고, 데이터의 순서가 없고, 키는 중복을 허용하지 않고 값의 중복은 허용 



Collection Interface


모든 컬렉션의 상위 인터페이스로 add,isEmpty,size 같은 핵심 메소드를 선언


List Interface


  • LinkedList
양방향 포인터 구조로 데이터 삽입, 삭제가 빈번할 경우 성능이 좋음
  • Stack
LIFO(Last In First Out) 형식으로 먼저 들어온게 출력 되는 구조 (http://noil0816.tistory.com/15?category=663296 참고)
  • Vector
ArrayList의 구형 버전이고, 모든 메소드가 동기화 되어 있음
  • ArrayList
속도가 빠르며 크기를 마음대로 조절할 수 있는 배열이며 단방향 포인터 구조로 자료에 대한 순차적 접근에 강점이 있음

Set Interface

  • HashSet
가장 빠른 임의 접근 속도를 가지고 있으며 순서를 예측 할 수 없음
  • TreeSet
정렬된 순서대로 보관하여 정렬 방법을 지정 할 수 있음
  • LinkedHashSet
가장 최근에 접근한 순서 또는 추가된 순서로 접근 가능



Map Interface


  • HashMap
중복을 허용하지 않고 순서를 보장 할 수 없고, 키와 값으로 null 허용
  • TreeMap
BST 형태로 키와 값으 쌍으로 이루어진 데이터를 저장하며 정렬된 순서로 키와 값을 저장하므로 빠른 검색이 가능하며 저장시 정렬(오름차순)하기 때문에 시간이 오래 걸림 
  • HashTable
HashMap 보다 느리지만 동기화를 지원하고 키와 값으로 null 허용 하지 않음
  • LinkedHashMap

HashMap을 상속받아 사용하므로 HashMap과 유사하며, Map에 있는 엔트리들의 연결 리스트를 유지하므로 입력한 순서대로 반복 가능















LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
JVM  (0) 2018.05.02
접근제어자  (0) 2018.05.02
오버라이딩과 오버로딩  (0) 2017.11.24
SMALL

JVM이란?


기술 면접 및 필기 시험에서 단골로 나오는 JVM에 대해 설명을 하겠습니다.

JVM은 Java Virtual Machine의 줄임말이며 자바 바이트 코드를 OS에 맞게 해석 해준다. 자바 컴파일러는 java 파일을 자바 바이트 코드로 변환시켜 .class 파일을 생성 시킨다. 바이트 코드는 기계어가 아니므로 OS에서 바로 실행 되지 않는다. OS가 바이트코드를 이해시켜주도록 도와주는 것이 JVM이다.

바이트 코드는 JVM위에서 OS 상관없이 실행된다. 이것이 Java의 가장 큰 장점 중 하나이다.


JVM 구조



JVM 구조는 3가지 영역으로 나누어진다.


1) Class Loader

런타임 시점에서 클래스를 로딩하여 클래스의 인스턴스를 생성하여 클래스 로더를 통해 메모리에 로드하게 된다.


2) Runtime Data Areas

JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당 밭은 메모리 공간이며, 크게 5가지 영역으로 나눌 수 있다.

  • PC Regisiter

 1. 스레드가 생성 될 때마다 생성되는 공간

 2. 스레드가 어떤 부분을 어떤 명령으로 실행할 지 기록

 3. 현재 실행되는 부분의 명령과 주소를 저장

 4. Native Method를 수행할 때는 PC Register는 Undefined 상태가 된다. 이것은 JVM을 거치지 않고 바로 API를 통해 바로 수행하게 된다는 의미인데, JAVA는 플랫폼에 종속 받지 않는 것을 의미한다.


  • JVM Stack
 1. 매서드가 호출되면 매서드와 매서드 정보를 스택에 쌓게된다.
 2. 매서드의 매개변수, 지역변수, 임시변수, 매서드 호출한 주소를 저장 
 3. 매서드 종료 시 메모리 공간에서 사라짐
  • Native Method Stack
 1. Java 외의 언어로 작성된 네이티브 코드들을 위한 Stack

 2. JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 Stack

 3. JNI를 이용하여 JVM 내부에 영향을 주지 않기 위해서이다.


  • Method Area
 1. 모든 쓰레드가 공유하는 메모리 영역

 2. 클래스, 인터페이스, 매서드, 필드, Static 변수를 저장


  • Heap
 1. 런타임시 동적으로 할당하여 사용 하는 영역
 2. new 연산자로 생성된 객체와 배열을 저장

3) Execution Engine

Load된 클래스의 바이트코드를 실행하는 런타임 모듈이 Execution Engine이다.
클래스 로더를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드는 Execution Engine에서 실행되며, 자바 바이트 코드를 명령어 단위로 읽고 실행



자주 나오는 질문


1. Stack 영역에서 메모리의 제한된 크기 이상을 사용하게 되면 오버플로우가 발생한다.

2. Heap 영역에서 메모리 할당/해제 동작이 반복되면 메모리 단편화 현상이 일어난다.

3. Heap 영역과 Stack 영역에 대한 메모리 접근속도는 Stack가 훨씬 빠르다. 왜냐하면 Stack는 미리 할당 된 공간을 사용하는 것이고 Heap은 사용시마다 할당 되기 때문이다.


LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
접근제어자  (0) 2018.05.02
오버라이딩과 오버로딩  (0) 2017.11.24
SMALL

접근 제어자란?


<종류/범위>

1. private : 같은 클래스 내에서만 접근가능

2. public : 접근 제한이 전혀 없다.

3. protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근가능

4. default : 같은 패키지 내에서만 접근 가능, 접근제어자를 지정하지 않았다면 자동으로 default로 지정


접근 제어자를 사용하는 이유


접근 제어자는 접근 할 수 있는 범위를 제한한다. 외부의 접근으로부터 데이터를 보호하거나, 굳이 보여줄 필요 없는 정보나 내부적으로 사용되는 정보를 숨기기 위해서 이다.

LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
오버라이딩과 오버로딩  (0) 2017.11.24
SMALL

오버라이딩?


부모 클래스로부터 상속받은 메서드를 재정의 하는 것



위에 보시다 싶이 People 클래스를 Man 클래스가 상속을 받아서 추상 매서드를 재정의 하였습니다. 이게 바로 오버라이딩 입니다.



오버라이딩 조건


1. 매서드 이름이 동일해야 한다.

2. 매개변수가 같아야 한다.

3. 리턴 타입이 같아야 한다.


오버라이딩 주의사항


1. 접근 제어자를 부모 클래스의 매서드보다 좁은 범위로 변경 할 수 없다.

2. 예외는 부모 클래스의 매서드보다 많이 선언할 수 없다.

3. 인스턴스 매서드를 스태틱매서드 또는 그 반대로 변경할 수 없다.


오버로딩?


같은 이름의 매소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르게 하는 것





















LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
접근제어자  (0) 2018.05.02

+ Recent posts