-
까먹기 전에 적는 안드로이드(Android) 자바(Java) 개발 직무 면접 질문 사항내가 바로 리뷰왕 ( ッ◕ ܫ◕)ッ 2020. 1. 20. 00:38
얼마만의 업로드인지 .. 오랜만이야 티스토리 🤭
이틀 연속 면접 보면서 정말 힘들었다 😨😱
다대다 면접은 기술적인 질문이 없어서 다행이었는데 ..
일대다 면접은 기술적인 질문을 정~말루 많이 해주셔서 하나도 답을 못했다 😬
그래서 ... 너무 속상해서 ... 정리해보는 ... 그 때 질문들에 대한 답변들 .......
근데 사실 질문들도 기억안남 처음 들어보는것들도 있어서 잘모르겠다는 말만 하고 나왔다는게 학계의 전설 ..^^;
괜찮아 .. 오늘 정리해보고 다음에 ... 다른 면접에서 써먹어 보자 .. 아자아자 ...^^...!
1. Menifest
Menifest에서 뭐가 뭐냐라고 물어봤는데 하나도 이해 못해서 기억두 안나는 질문 ..
2. Thread(쓰레드)
하나의 프로세스 내부에서 독립적으로 실행되는 하나의 작업 단위.
프로세스는 메모리를 할당받아 실행중인 프로그램
보통 하나의 루틴(프로그램 처리 경로)를 가지고 있다.
일을 수행하는 것에 있어서 프로그래머가 원하는 순서대로 일을 처리하는데
앞뒤 순서가 필요없는 일들이 있을 때 분리해서 동시에 처리하고 싶을 때!
자바에서 쓰레드를 사용한다
(=> 순서 상관 없이 동시에 처리될 수 있는 일들에 대해 쓰레드로 처리)
쓰레드 이용시 하나의 프로세스에서 병렬적으로 처리 가능(= 여러 개의 처리 루틴을 가질 수 있음)
& 단순 반복의 코드를 실행할 때 여러개의 쓰레드를 만들어 분리시킨 뒤 결과 데이터를 받아 합치면 시간 절약 가능
main() 안의 실행문들이 하나의 쓰레드.
<구동하는 방법 : Thread 클래스 상속 OR Runnable 인터페이스 구현>
java.lang.Thread
1. Thread 클래스 상속
123456789101112131415161718192021222324252627282930public class ThreadTest extends Thread{//run()을 오버라이딩public void run() {//인터럽트 되었을때 예외처리try {for(int i=0;i<10;i++) {Thread.sleep(500);System.out.println("Thread : " + i);}} catch (InterruptedException e) {System.out.println(e);}}}public class Thread1 {public static void main(string args[]) {ThreadTest t1 = new ThreadTest();ThreadTest t2 = new ThreadTest();//start() 사용시 동시에 똑같은 숫자가 나온다.t1.start();t2.start();//run() 사용시 번갈아가면서 나온다.t1.run();t2.run();}}cs ※ 1. 인터페이스는 JDK 라이브러리 인터페이스이고 run() 메소드만 정의되어 있다
※ 2. Runnable 인터페이스 이용 => 현재의 클래스가 이미 다른 클래스로부터 상속받고 있다면 사용123456789101112131415161718192021222324252627282930public class RunnableTest implements Runnable{//Runnable 인터페이스의 run() 오버라이딩public void run() {//인터럽트 되었을때 예외처리try {for(int i=0;i<10;i++) {Thread.sleep(200);System.out.println("Thread : " + i);}} catch (InterruptedException e) {e.printStackTrace();}}}public class Thread2 {public static void main(string args[]) {//Runnable 인터페이스 객체 생성RunnableTest r1 = new RunnableTest();RunnableTest r2 = new RunnableTest();//Runnable 객체를 매개변수로 하여 스레드 객체 생성Thread th1 = new Thread(r1);Thread th2 = new Thread(r2);t1.start();t2.start();}}cs * 결론 *
- run() 메소드가 종료하면 스레드는 종료된다. => 스레드를 계속 실행시키려면 run() 메소드를 무한루프 속에서 실행
- 한 번 종료한 스레드는 다시 시작시킬 수 없다. => 스레드 객체 다시 생성
- 한 스레드에서 다른 스레드를 강제 종료 할 수 있다.
- 스레드의 상태 6가지
- New : 스레드가 생성되었지만 아직 실행할 준비 X
- Runnable : 스레드가 실행되고 있거나 실행준비되어 기다리는 상태
- Waiting : 다른 스레드가 notify(), notifyAll()을 불러주기 기다리고 있는 상태 (동기화)
- Timed_Waiting : 스레드가 sleep(n) 호출로 인해 n밀리초 동안 잠을 자고 있는 상태
- Block : 스레드가 I/O 작업을 요청하면 자동으로 스레드를 block 상태로
- Terminated : 스레드가 종료한 상태
3. 오버로드와 오버라이딩 차이
오버로드 : 한 클래스 내에 같은 이름의 메서드를 여러 개 정의 !
=> 하나의 매서드 이름으로 여러 기능 구현 & 메서드의 이름을 절약할 수 있음
메서드 이름은 같아야 하고 매개변수의 개수 또는 타입이 달라야한다
오버라이딩 : 자손 클래스에서 조상 클래스의 메서드와 이름, 매개변수, 리턴타입을 같게 하고 내용만 새로 작성하는 것
조상 클래스의 메서드보다 많은 수의 예외를 선언 할 수 X
1234567891011class Parent() {void parentMethod() { }}class Child extends Parent {void parentMethod() { } //오버라이딩void parentMethod(int i) { } //오버로딩void childMethod() { }void childMethod(int i) { } //오버로딩}cs 이거 대답 못한건 솔직ㅎ ㅣ.. 존나 억울해 ...싀바 ....
4. String과 StringBuffer의 차이 (+ 추가로 StringBuilder까지 찾아봄)
공통점 : String(문자열)을 저장하고 관리하는 클래스들
- String <-> StringBuffer, StringBuilder : String은 불변하고 StringBuffer, StringBuilder는 가변하다
=> String은 new 연산을 통해 생성되면 메모리 공간이 절대 변하지 않아서 '+' 연산이나 concat을 이용하여 문자열에 변화를 주어도 메모리 공간이 변하는 것 X, String 객체를 new로 만들어서 새로운 메모리 공간을 만듦 ! 그래서 새로운 문자열이 만들어지면 기존의 문자열은 언제 제거될지 모른다는 문제가 있음 & 문자열 연산이 많아지면 계속해서 객체를 만드는 오버헤드가 발생하여 성능이 떨어짐. 하지만 String은 불변하여 단순하게 읽는 조회연산에서는 빠르게 읽을 수 있다(= 멀티쓰레드 환경에서 동기화를 신경쓸 필요 X)
StringBuffer, Stringbuilder는 new를 한 번만 만들고 연산이 필요하면 크기를 변경시켜서 문자열을 변경하니까 문자열 연산이 자주 있을 때 사용하면 성능에 좋음 ! & 둘 다 AbstractStringBuilder라는 추상 클래스를 상속 받아 구현
- StringBuffer <-> StringBuilder : StringBuffer는 멀티스레드환경에서 synchronized 키워드가 가능하여 동기화 가능 BUT StringBuilder는 동기화를 고려하지 않으니 싱글스레드 환경에서 StringBuffer에 비해 연산처리가 빠름
* 결론 *
- String 클래스는 문자열 연산이 적고 조회가 많을 때 멀티스레드 환경에서 사용하면 좋다
- 문자열 연산이 많을때 멀티스레드환경에서는 StringBuffer, 싱글스레드 or 스레드 신경 X 환경에서는 StringBuilder
5. 동기화와 비동기화 차이
동기화 : 한 자원에 대해 동시에 접근하는 것을 제한하는 방식 => 순서를 지킨다
시스템 콜이 끝날때까지 다른 스레드의 접근을 막아버리는 것.
nextLine()에서 입력을 받을 때까지 대기하는 것과 동일.
비동기화 : 한 자원에 대해 동시에 접근 가능
시스템 콜이 왔든 말든 상관 없이 계속 호출이 가능.
Call Back 함수를 통해 결과를 가져옴.
=> 동기화와 비동기화는 결과물을 가져오는 시점이 다르다.
* JAVA에서는 ? *
자바에서의 동기화(Synchronized) : 멀티스레드에서의 접근을 제한.
동기화가 없다면 스레드의 메소드 호출 순서가 꼬여버림 ! -> 동기화 사용시 순서가 지켜진다
6. 모바일 웹과 앱의 차이점
공통점 : 모두 스마트폰에서 사용 가능
모바일 웹 : 말 그래도 Webpage. 모바일웹 = 홈페이지 !
브라우저를 통해 동작하고 사용 단말기에 제한이 없음(모바일의 어떤 환경에서도 사용 가능)
모바일에 따로 설치가 필요하지 않고 스마트폰에 웹홈페이지를 띄워주는 것, 서버 환경에 따른 보안
개발 시 웹(HTML, CSS, JavaScript) 언어를 사용
모바일 앱 : Application. 스토어에서 모바일에 따로 설치하여 사용할 수 있으며
스토어 환경에 따른 보안, 사용 단말기 OS에 따라 제한이 있다. OS에 맞춘 독립적 동작
인터넷 환경에 영향을 받지 않아 반응속도가 빠르지만 앱의 내용이 변경된다면 업데이트시 큰 용량을 필요로 한다
개발 시 안드로이드, iOS 등 각 플랫폼에 맞는 언어를 사용
7. 자바(Java)와 코틀린(Kotlin)의 차이점
코틀린의 장점 : 간결 & 안정성 & 호환이 좋음 & 코드의 양을 줄여주고 Null Pointer 예외에 대한 어플 튕김 현상 감소
- 코틀린의 코드 길이는 자바의 코드 길이에 비해 짧고 간결하다. 코틀린은 기본적으로 람다식을 제공한다.
- 기본값 : 자바는 null이지만 코틀린은 기본값이 null이 아니기 때문에 null을 쓰고싶다면 Nullable을 선언해야한다. => var num :String? = "hello" 이런식으로 물음표를 붙이면 null이 비허용된 변수임 !!
- 데이터 클래스 : 자바는 GET/SET 메서드를 일일히 구현해야하지만 코틀린은 data class로 만들면 GET/SET, toString, copy 함수를 알아서 생성해준다.
- Type aliases : 코틀린은 자바와 다르게 이름이 길거나 어려운 자료형에 마음대로 별명을 붙여 사용이 가능하다.
- 변수 사용 : println 사용시 $ 을 통해 간단하게 변수 사용(Java는 +를 사용함) => + 를 사용하지 않아 코드가 깔끔 !
1234567891011121314151617181920212223242526272829303132333435363738394041424344public class PersonJava {private String name;private int age;private int tall;private int person_id;public PersonJava(String name, int age, int tall, int person_id) {this.name = name;this.age = age;this.tall = tall;this.person_id = person_id;}public String getName() {return name;}public void SetName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getTall() {return tall;}public void setTall(int tall) {this.tall = tall;}public int getPerson_id() {return person_id;}public void setPerson_id(int person_id) {this.person_id = person_id;}cs 자바에서는 이 ~ 렇게 길고 귀찮은 GET/SET 메서드가 코틀린에서는 ...
1data class PersonKotlin(var name:String, var get:Int, var tall:Int, var person_id:Int)cs 한 줄이면 충-분 ... 아 이런건 줄 알았으면 코틀린 공부나 할걸
자바로밖에 공부 안해서 쏘카도 지원 못해보고 어휴 .. 껄껄 ~
코틀린에서는 저렇게 data로 class를 정의해준다면 생성자 안에 정의된 매개변수를 자동으로 getter,setter,toString 등을 사용할 수 있게 해준단다
1234567var person = PsersonKotlin("hellolsh",24,162,12345)var name = person.namevar age = person.agevar tall = person.tallvar person_id = person.person_idperson.toString()person.hashCode()cs 코틀린에서는 이런식으로 사용할 수 있단다 그리고 코틀린은 새미콜론도 안써 ... 솔직히 혁명 아니냐 ㅇㅈ?
123var ex1 = "예제입니다"var ex2 = 1println("예제의 결과는 :: $ex1 숫자는 :: $ex2")cs 12var person = PersonKotlin("hellolsh",24,162,12345)println("이름은 ${person.name} 이며, 나이는 ${person.age} 입니다.")cs 그리고 변수 사용은 이런 식으로 해주면 된다 ..! 와 멋지네 코틀린 나중에 취업 하고 나면 코틀린에 대해 공부해보겠음^_^ (언제가 될지 모른다는게 함정이죠:? = "ㅇㅇ")8. 트랜잭션
요 것은 ... 데이터베이스 부분이지만 .... 데이터베이스 자격증이 있어서 물어보심 ..^_^ 하핫
트랜잭션 : 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
=> 데이터베이스의 상태를 변화시킨다는 것은 ? : SQL을 이용하여 데이터베이스를 접근 하는 것 !
(ex. SELECT, INSERT, DELETE, UPDATE)
작업의 단위는 질의어 한문장이 아니라 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것.
트랜잭션의 특징
- 원자성 (Atomicity) : 트랜잭션이 데이터베이스에 모두 반영 OR 전혀 반영이 되지 않던가 둘 중 하나
- 일관성 (Consistency) : 트랜잭션의 작업 처리 결과가 항상 일관성 있어야 한다 ! => 트랜잭션이 진행되는 동안 DB가 변경되더라도 업데이트된 DB로 트랜잭션을 실행하는 게 아니라 처음 참조한 DB로 진행하는 것
- 독립성 (Isolation) : 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우에 어느 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없다. (= 하나의 특정 트랜잭션이 완료될때까지 다른 트랜잭션이 특정 트랜잭션의 결과 참조 X)
- 지속성 (Durability) : 트랜잭션이 성공적으로 완료되었을 경우 결과는 영구적으로 반영되어야 함
- Commit : 하나의 트랜잭션이 성공적으로 끝났고 데이터베이스가 일관성 있는 상태에 있을 때 하나의 트랜잭션이 끝났다라는 것을 알리기위해 사용하는 연산. 수행했던 트랜잭션이 로그에 저장
- Rollback : 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우 트랜잭션을 처음부터 다시 시작하거나 부분적으로만 연산된 결과를 취소시킨다.
9. 플러터(Flutter)
Flutter 들어봤냐고 물어보시길래.. 정확한건 모르겠고 다른 안드로이드 구인 광고에서 Flutter 사용 우대 하는건 봤다고 대답함 ^^ ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 다시 생각해봤는데 존나 어이없넹 .. 🤣🤣
플러터 : 안드로이드와 iOS 모바일 애플리케이션을 하나의 소스로 개발할 수 있는 UI 프레임워크.
=> 즉 플러터로 작성하면 안드로이드 기기와 iOS 기기에 동시에 배포 가능. (오 ..... 이런 좋은게 ....?)
플러터도 구글에서 만들어졌고 ... 공식 유투브 채널도 있ㄴ고 ...
다트(Dart)라는 언어로 개발하고 .... 새삼 구글 참 대단하다 (😏
다트 언어는.. 2018년 가장 배울 필요가 없는 언어 ..?...ㅋㅋㅋㅋㅋㅋㅋㅋ
라서 다트 자체로는 힘이 없지만 플러터에 탑재하기로 하면서 다시 주목을 받고 있다카더라 ... 그렇군뇨.
나중에 시간이 된다면 플러터로 함 개발을 해보도록 하겠습니다 ..
+) 10. left join과 inner join의 차이 (자려고 누웠다가 생각난 질문 추가하기 ㅎㅎ.. )
* inner join : 일반적인 join 방식으로 조인하려는 두 테이블의 조건에 맞는 레코드만 출력하는 형태
* left (outer) join : 왼쪽 테이블을 기준으로 왼쪽 테이블의 모든 값 + 조건에 맞는 레코드를 출력하는 형태
-> right (outer) join은 오른쪽 테이블을 기준으로 하는 left join과 같은 원리
사실 이 외에도 기술적인 질문 여러개 있었던걸로 기억하는데 .. 질문이 뭐였는지 도당체 기억이 안남 🤷♀️
그래서 포기하고 개인 프로젝트 관련된거나 학교 얘기나 개인적인 질문들은
질문 받으면 아는 거랑 생각나는 거 바로바로 얘기했고 ..
기술적인 질문 빼면 괜찮은 면접이었는데 참 ..^_^ 호호
신입은 들어가서 배우는 거라면서 기술적인 질문은 왜 해요 ! 어이업네 !
물론 내가 기초적인거 틀린건 문제지만 !
아무튼 그래도 오랜만에 공부하는 시간 가졌음니다.. 감사합니다 ..
다음에도 다른 좋은 면접 기회가 오길 바라면서 .. 🙏
그럼 20000 !
아 맞다 저의 티스토리를 찾아주신 1000분의 방문자 분들께 감사함을 ..^^*
참고
JAVA String, StringBuffer, StringBuilder 차이점
[자바] 동기화 처리 - Synchronized 와 Asynchronized
[Java] 자바 동기화(synchronezed) 하는 방법
모바일 웹과 앱(어플)의 차이점!
앱과 웹의 차이
[안드로이드] Java와 Kotlin의 간단한 비교
트랜잭션(Transaction)이란?
[SQL] INNER 조인과 OUTER조인이 무엇인가요?
'내가 바로 리뷰왕 ( ッ◕ ܫ◕)ッ' 카테고리의 다른 글
서울 성수동 카페 카페봇 (0) 2020.02.04 청주 성안길/시내 맛집 킨토토소바 (0) 2020.02.03 191117 토익 스피킹 시험 및 레벨6 후기 🤞 (0) 2019.12.01 해커스 토익스피킹 2주 패스 인강 후기 (이것도 광고 아니다) (0) 2019.11.24 해커스 토익교재 무료배포 후기 (광고 아니다) (0) 2019.07.24