티스토리 뷰

반응형

출처 : 개발자 인큐티비 유튜브

https://youtu.be/a-f0HxYRNiM

 

 

 

1. java의 컴파일 과정을 말해보라

 

1. 개발자가 .java파일을 생성한다

2. build를 한다

3. java compiler의 javac 명령어를 통해 바이트코드(.class파일)를 생성한다

4. class loader를 통해 JVM내로 로드

5. 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석되어(각 운영체제에 맞는 기계어)

Runtime Data Area에 배치된다

 

 

 

 

 

1-1 compiler vs Interpreter

컴파일러전체 소스코드를 보고 명령어를 수집하고 재구성하지만

인터프리터는 소스코드의 각 행을 연속적으로 분석하며 실행한다

 

둘 다 고레벨 언어로 작성된 프로그래밍 언어를 기계어로 번역하는 것은 동일하다

 

인터프리터는 고레벨 언어를 바로 기계어로 번역하지 않고 중간 형태로 변환시킨 후 실행한다

반면 컴파일러는 고레벨 언어를 바로 기계어로 변환한다

 

 

인터프리터 특성 4가지

  1. 컴파일러는 소스코드 전체를 훑고 컴퓨터 프로세서가 실행 할 수 있도록 바로 기계어로 변환한다. 인터프리터는 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다. 이 중간 코드는 다른 프로그램에 의해 실행된다.
  2. 일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다는 실행시간이 빠르다.
  3. 컴파일러는 전체 소스코드 변환 후 에러를 보고하지만 인터프리터는 각 행마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 보지 않는다. 보안적인 관점에서 도움이 된다.
  4. 파이썬은 인터프리터 언어, C,C++은 컴파일 언어, 자바는 컴파일러와 인터프리터 모두 사용한다

 

 

자바에서 compiler와 Interpreter가 하는 일

 

helloworld.java를 작성하고 javac명령어를 통해 바이트코드 helloworld.class로 변환한다

(자바 컴파일러가 수행)

.java->javac->.class

여기서 자바의 컴파일러는 프로그래밍언어를 하드웨어를 위한 기계어가아닌

JVM을 위한 기계어로 변환한다

 

인터프리터는 .class파일을 특정 환경의 기계에서 실행될 수 있도록 변환한다

 

 

파이썬은 인터프리터, c/c++은 컴파일러를 사용한다고 한다

컴파일러가 인터프리터에 비해 속도가 빠르기때문에

하드웨어 제어는 보통 c/c++을 사용하는 것이 이제 이해가 된다

 

그렇다면 java는 왜 컴파일러랑 인터프리터를 사용할까?

1. 인터프리팅은 플랫폼에 종속되지 않는다(이식성이 좋다)

2. 바이트코드는 컴퓨터와 프로그램 사이 별도의 버퍼 역할을 한다

-> 이는 보안적인 장점이 될 수도 있다 바이러스나 기타 악성 프로그램에

대응하는 가드 같은 보안 계층에 의해 보호 될 수 있다

 

 

컴파일러 - 바이트 코드 생성(보안적인 장점)

인터프리터 - 플랫폼 독립적

 

java는 두가지 장점을 다 가져간다

 

 

 

컴파일러와 인터프리터의 차이는 모두 밑의 내용을 참고했습니다

출처 : https://velog.io/@jaeyunn_15/OS-Compiler-vs-Interpreter

 

[OS] Compiler vs Interpreter

1\. 인터프리터 방식원래 인터프리터의 의미는 고급 언어로 작성된 프로그램을 한줄씩 번역해서 OS에서 인식하는 기계어로 변역하는 역할이다.자바 인터프리터는 JAVAC 명령으로 자바 프로그램을

velog.io

 

 

 

 

2. String, StringBuilder, StringBuffer의 차이

  • String  불변객체이기 떄문에 변하지 않는 문자열은 String을 사용한다
  • StringBuilder(가변) 비동기방식이기 때문에 Single Thread 환경하에서, 변화되는 문자열을 사용한다. 비동기 방식이기 때문에 처리속도는 제일 빠르다
  • StringBuffer(가변) 동기방식으로 저장되기 때문에 멀티쓰레드로 접근하거나 문자열이 변경될 경우에 사용한다

 

 

2-1 thread safe란?

동기화가 적용이 되어 안정한 환경을 말한다

예를 들어 StringBuilder는 변경가능하지만 synchronization이 적용되지 않아

쓰레드들이 동시에 StringBuilder클래스에 접근할 수 있다

하지만 StringBuffer는 변경가능하지만 synchronizaiton이 적용되어

multiple thread환경에서 각 쓰레드가 만든 메소드의 호출 순서와

특정 instance에 대한 모든 작업이 일치하기때문에 안전하다고 볼 수 있다

 

stringbuffer api

쓰레드에 대한 지식이 부족해서

stringbuffer가 stringbuilder에 비해 멀티쓰레드 환경에서 안전한것이 thread safe인 것은 알겠는데

실제로 어떻게 사용되는지에 대한 것은 아직 잘 모르겠다

 

 

 

 

2-2 java string이 불변객체인 이유

출처 : https://starkying.tistory.com/entry/why-java-string-is-immutable

 

Java에서 String은 왜 불변일까?

Java에서 String은 불변(Immutable) 객체이다. 불변 객체란 무엇일까? 불변 객체란, 객체가 생성된 후 내부의 상태가 변하지 않고 계속 유지되는 객체를 말한다. 즉, 변수에 객체가 한 번 할당되면, 해

starkying.tistory.com

 

1. String Pool

java에서는 string pool이라는 공간에 string을 포함시켜서

값이 같은 string이라면 객체를 새로 생성하지 않고 string pool에 있는 객체를

재사용할 수 있도록 구현했다

string이 immutable(불변)이기 때문에 객체 공유가 가능해진다

즉 string pool을 만들기 위해 string을 immutable한 객체로 만들어야했다

 

 

2. 보안

메소드에서 string을 받는데

string이 mutable하다면 메소드의 인자로 받은 값은 메소드의 caller(호출자)에 의해 언제든지 바뀔 수 있게 된다

이는 보안상 엄청난 취약점을 발생시킨다

 

 

3. 동기화(Synchronizatinon)

객체가 불변이면 멀티스레드 환경에서도 값이 바뀔 위험이 없기 때문에 thread-safe한 특성을 갖게된다

동기화와 관련된 위험요소 벗어날 수 있고, 여러 쓰레드에서 동시에 접근해도 별다른 문제가 없다

 

 

4. Hashcode Caching

String의 hashCode() 메소드 구현을 보면 아직 hash값을 계산한 적이 업승ㄹ 때 최초 1번만

실제 계산 로직을 수행한다

이후부터는 이전에 계산했던 값으르 그냥 리턴만 하도록 되어 있다

즉 hashCode 값을 캐싱(caching)하고 있다

 

 

5. 성능

String이 불변성을 가짐으로써 성능이라는 측면에서 유리하다

 

 

 

 

 

 

 

 

 

 

반응형

'면접질문' 카테고리의 다른 글

백엔드개발 기술면접) 신입개발자 JAVA 1-2  (0) 2022.03.01
개발자 공통질문  (0) 2021.09.09
중소기업 개발자 공통질문  (0) 2021.09.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함