'기술면접'에 해당되는 글 2건

허니몬의 IT 이야기/프로그래머, '코드 엔지니어'

1. 두 함수(show(), show2()를 비교하라.

  1. public class ShowTest {
        public void show(String cmd){
            if ( cmd.equals("Test")){
                System.out.println("cmd is Test");
            }
        }
       
        public void show2(String cmd){
            if( "Test".equals(cmd)) {
                System.out.println("cmd is Test");
            }
        }
    }

  1. // 1번 문제는 equals(String cmd)에 null 값이 들어갔을 경우에 대한 질문... ㅡㅅ-)> 그런 경우는 생각을 안해봤어!!
    //그런 경험은 있지만... equals() 안에 들어가는 파라메터가 null 일 때 생기는 경우는 종종 있지.... ㅡㅅ-)>
    public class Main {
        public static void main(String[] args) {
            //String cmd = null;  //이 경우에는 show()에서 NullPointerException을 발생한다. 요게 질문의 핵심인듯.
            //String cmd = "Test"; //이 경우에는 show(), show2() 모두 정상적으로 실행
            String cmd = "test"; // 이건 당연히 둘다 반응 없음.
           
            ShowTest test = new ShowTest();
            test.show(cmd);
            test.show2(cmd);
        }
    }

 

2.고쳐야 할 부분은 어디!?

  1. public class ShowTest2 {
        public void show(String cmd){
            if ( cmd.equals("Test") && cmd != null ){ // 넘겨받은 cmd가 null일 경우에는 NullPointerException이 발생.
                System.out.println("cmd is Test");
            }
        }
    } //cmd.equals("Test") 이 부분을 "Test".equals(cmd) 수정해주면 정상적인 처리가 되겠지요.... ㅡㅅ-)> 잇힝!!!

  1. public class Main2 {
        public static void main(String[] args) {
            //String cmd = "Test";
            String cmd = null;
            ShowTest2 test = new ShowTest2();
            test.show(cmd);
        }
    }

 

3.이 경우에는 어떻게 나올까?

  1. public class ShowTest3 {
        public static void main(String[] args) {
            boolean a;
            boolean c;
            a = c = true;
           
            if ( ( a = true ) || ( c = false )){ // true or false ==> true 이니까....
                System.out.println("1:" + a + "   " + c); // 요 녀석이 출력된다. 조건문 안에서 대입하는건 안좋아요...ㅡㅅ-)!!
            }
           
            if ( ( a = true ) && ( c = false)){ //true && false ==> false 이니까.... 다시 물으니까... 당황해서 답을 제대로 못했다. ㅠㅅ-)
                System.out.println("2:" + a + "   " + c);
            }
        }
    }

4.String, StringBuffer, StringBuilder의 차이점(셋다 문자열 객체)

참고 : http://hongsgo.egloos.com/2033998 요 글을 보면, String < StringBuffer < StringBuilder 속도 차이가 있다. 흠... String은 적게 쓰는게 좋군요. ㅡㅅ-);;

참고 : http://cacky.tistory.com/36

  • String : 변경되지 않는 Character 문자열 객체
    문자열이 변경되지 않을 경우에는 String 사용
  • StringBuffer : 값이 변경 가능 // 동기화 가능 : 다중 스레드 일 경우에 사용
    문자열이 변경되고 다중 스레드에서 사용될 경우 사용
  • StringBuilder : 값이 변경 가능 // 동기화 되지 않음 : 단일 스레드일 경우에 사용
    문자열이 변경되고, 단일 스레드에서 사용될 경우 사용

 

5.가비지 컬렉션을 줄이기 위한 프로그래밍

Java에서는 기본적으로 가비지 컬렉션에 대해서는 JVM에서 처리를 해주기 때문에 크게 신경을 쓰지 않아도 된다고 배웠다. ㅡㅅ-)>

굳이 줄이는 방법을 떠올려보자면,

 

6.Statement와 PreparedStatement의 차이

java.sql.Statement
public interface Statement
extends Wrapper
 

정적 SQL 문을 실행해, 작성된 결과를 돌려주기 위해서(때문에) 사용되는 객체입니다.  

디폴트에서는,Statement객체 마다 1 개의ResultSet객체만이 동시에 오픈할 수 있습니다. 따라서, 1 개의ResultSet객체의 read가, 다른 read에 의해 끼어들어지면(자), 각각은 다른Statement객체에 의해 생성된 것이 됩니다.Statement인터페이스의 모든 execution 메소드는, 문장의 현재의ResultSet객체로 오픈되고 있는 것이 존재하면, 그것을 암묵에 클로즈 합니다.

관련 항목:
Connection.createStatement(),ResultSet

 

java.sql.PreparedStatement

public interface PreparedStatement
extends Statement
 

프리컴파일 된 SQL 문을 나타내는 객체입니다.  

SQL 문은, 프리컴파일 되어PreparedStatement객체에 포함됩니다. 거기서, 이 객체는, 이 문장을 여러 차례 효율적으로 실행하는 목적으로 사용할 수 있습니다.

주:IN 파라미터치를 설정하는 설정 기능 메소드 (setShort,setString등)는, 입력 파라미터의 정의된 SQL 형과 호환이 있는 형태를 지정하지 않으면 안됩니다. 예를 들어, IN 파라미터에INTEGER라고 하는 SQL 형이 있는 경우,setInt메소드를 사용하지 않으면 안됩니다.

임의의 파라미터형 변환이 필요한 경우는,setObject메소드는, 목적의 SQL 형으로 사용하지 않으면 안됩니다.  파라미터 설정의 예를 다음에 나타냅니다.con는 액티브한 접속을 나타냅니다.

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ? ");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
관련 항목:
Connection.prepareStatement(java.lang.String),ResultSet

 

PreparedStatement 에 대한 설명 : http://pcguy7.springnote.com/pages/1052420
 

Summary

그래서 우리는 prepared statements를 파라메터와 함께 사용해야한다.
이것은 미리 만들어진 접근 계획을 재 사용하므로서 데이터 베이스에 대한 로드를
줄여 준다.
이 cache는 데이터 베이스가 확장된 것이어서 여러분의 모든 애플리케이션이
유사한 파라메터화된 sql을 사용하면 하나의 애플리케이션이 다른 애플리케이션에
의해 사용된 prepared statements를 이용하므로 캐시 스키마의 효율성을 증대
시킬 수 있다.
이것은 application server 사용의 이점이다. 왜냐하면 데이터 베이스에 접근하는
로직은 데이터 접근 계층에 집중화 되어야하기 때문이다.
두번째로 prepared statements의 올바른 사용은 또한 여러분이 애플리 케이션 내부의
prepared statements cache를 잘 이용할 수 있게 한다. 이것은 애플리케이션이
이전에 사용했던 prepared statements 호출을 재사용해서 JDBC driver에 대한 호출의
수를 감소시켜 성능의 향상을 시킨다. 이것은 현명한 fat clients 사용을 효율적으로
그리고 경쟁력있게 만들고
독점적인 connection을 유지할 수 없는 불이익을 제거한다.
만약 파라메타화된 prepared statements를 사용한다면 여러분은 데이터 베이스와

코드를 가지고 있는 application server의 효율을 높일 수 있다. 이들 개선된 점은

여러분의 애플리케이션의 성능을 향상 시킬수 있게 할것이다.

내 나름의 중요한 결론을 말해보자면, 'PreparedStatement를 잘 활용하면 CPU 사용량을 줄이고 DB에 접근하는 소프트웨어의 속도를 향상시키는 효과가 있다'는 것이다. ㅡ ㅅ-)> 내가 쓰기 불편하다고 Statement 형식으로 많이 썼었는데, 이제 PreparedStatement를 사용해야겠다. 나란 녀석도 참 고집이 쎄다. 그렇게 쓰는 장점이 있는데도, 내가 쓰기 편하다고 그 방식을 외면하고 있으니 말이다.

이 글은 스프링노트에서 작성되었습니다.

허니몬에 관한 보고서/허니몬의 드림성공노트
  오늘은 국내 우량벤처기업인 ㈜잉카인터넷의 자바관련 보안SW 개발 신입 부분에 면접을 볼 수 있는 기회가 저에게 주어졌습니다. ^^; 미천한 저의 이력서를 보고 면접의 기회를 주신거에 대해서 다시한번 감사드립니다.
 
  어제 오후(18:53)에 온 연락을 받고 부랴부랴 ActiveX와 ActiveX 대체 기술들에 대한 검색에 들어갔습니다(결론은 급벼락치기를 한 내용들이지만, 머리에는 제대로 들어오지 않더군요. 벼락치기보다는 다양한 분야에 대한 꾸준하고 깊은 탐구와 사고가 필요하다는 것을 절감하는 날이었습니다. 하나에 관심을 가지게 되면 깊게 파자.).

  ActiveX 대체 기술로는, 공인인증서는 Java 를 이용하면 Platform(운영체제, 브라우저 등)에 독립적인 형태로 구현할 수 있고, UI 부분은 Ajax 기술을 이용하여 구현할 수 있고, 나머지 기능들은 실버라이트와 같은 RIA(Flex, JavaFx)를 이용해서 대체할 수 있다. 그런데!! 난 이걸 말하지 못한 것이다!! 이 얼마나 통탄할 만한 경우가 아니겠는가. OTL... 이런 기분이랄까? 자기소개서 입사지원동기 부분에서는 자랑스럽게 ActiveX를 대체할 수 있는 기술에 대해서 언급을 해놓고는...

  이런 실수를 반복하지 않기위해서라도 이렇게 기록을 남겨줘야 한다. ㅡㅅ-);; 이것도 내 나름의 장점인건데!! 자기소개에서 제대로 하지 못했어. ㅠㅅ-) 으흑... 왜그리 긴장을 했는지 모르겠지만, 이미 활은 날아갔고 총알도 튕겨나갔다.

  우리나라의 실리콘벨리는 이제 테헤란로에서 강서지역(구로디지털단지, 가산디지털단지, 상암쪽)으로 넘어가고 있는 상황이 되고 있는 것은 확실해보인다. 구로디지털단지는 정말 오랜만에 와본다. 2년만이다. KIPA에서 임베디드 인력양성 사업 때문에 가락동에서 이곳까지 매일 오고가던 생각을 하면... ㅡㅅ-)> 후훗, 집에서 여기오는 것도 나름 일이다. 딱 한시간 20분 소요되었다. 면접볼 때는 10분 단축...!! 해서 1시간 10분 걸린다고 이야기했다. >ㅅ<)

  구로디지털단지역도 모습이 많이 바뀌어가고 있었다. 아마도 국내 IT 거점지역으로서의 위상도 크게 높아진 덕분도 있을 것이고 서울자체(지역구청)에서 밀어주는 덕분도 있을 것이다. 뜨거운 열기로 가득한 오후였지만, 많은 사람들이 오고가는 모습을 볼 수가 있었다. 나도 저들 사이에서 직장인이고프다. 백수 생활이 길어지니까 몸이 견뎌내질 못하고 있다.


  높은 건물들(저 건물들 안에는 수많은 IT 관련 업체들(임베디드, 펌웨어, SI 등등)이 상주하고 있으며, 많은 이들이 피땀흘리면서 일하고 있을 것이다(냉방시설은 시원하겠지만). 그리고 곳곳에 보이는 찜질방은 내가 이곳에서 일하게 된다면 좋은 휴식처가 되어줄(술마시고 집에 못갈때?) 든든한 모습을 보여주고 있다. 우훗!!


  임베디드 인력양성 사업 교육이 있던 포륭 건물이다. ㅡㅅ-);; 지하에 먹거리 식당이 있지만, 우리동네보다는 1~3000원 비싸다. 그래도 어쩌겠는가!? 살기위해 먹어야지... 구름한점 없이 쾌청하고 맑은 하늘, 그리고 강렬히 내리쬐는 태양은 나를 땀흘리게 만들었다. 오래 입을 수 있도록 가을 정장을 맞춰입은 탓에(거기다가 블랙!!) 더웠다. 내가 구로디지털단지역에 도착한 시간은 14:10. ㈜잉카인터넷이 있는 에이스하이엔드타워 근처에 있는 편의점에서 음료수 한잔 마시고 쉬면서 무슨 말을 해야할지 고민했다. 고민했지만.. 벼락치기 공부는 역시 성과가 없었다. 췟... ㅡㅅ-)


즐비하게 들어서 있는 신식 건물들. ㅡㅅ-);; 통짜유리로 구성되어 있어서 한여름에는 냉방비좀 나올 것이다. 내가 왜 이런 걱정을 하고 있지? ^^;; ㅎㅎ. 쓸데없는 걱정도 팔자.


자, 시험을 보기 위해 12층으로 이동!!!


  ㈜잉카인터넷의 브랜드네임인 nProtect 다. 다양한 솔루션들을 제공하고 있고, 나에게 젤 익숙한 것은 nProtect netizen과 game guard 가 아닐까 싶다. 국내대표 벤처기업답게 내부는 깔끔했고, 아늑한 느낌을 준다. 오홋... ㅡㅅ-);; 입구에서 면접 실무자와 만난 덕분에 도촬은 못했다. OTL... 좀 더 훔쳐보고(?) 왔어야 했는데.


  내가 면접을 본 곳. 나는 면접시간 보다 10분 먼저 도착(사실 40분 먼저 도착)해서 5분 전에 입구에 도착한 상태였다. 약속시간 보다 10분 정도 먼저 도착해서 기다리는 건 다른 사람들에게도 도움이 된다고 생각한다. 참고바랍니다.


  제가 면접을 본 회의실 풍경입니다. 깔끔하지요? 허브가 탁자 위에 있는 건 조금 안습. ㅠㅅ-) 거기서 30분이 약간 넘는 면접이 진행되었습니다. 자기소개, 학교생활, 취미생활, 사회생활 관련 질문( 상사가 나보다 나이가 어리다면? 상사가 나에게 내가 싫어하는 일을 시킨다면? ) 이 주어졌습니다.


  - 상사가 나보다 나이가 어리다면?
  ㅡㅅ-)> 다른 거 없다. 무조건 충성하고, 상사를 롤모델삼아서 따라하면서 그 사람이 나보다 어린 나이에 나보다 위에 있을 수 있는 이유를 철저하게 분석하여 내게 부족한 점들을 보완해줘야 한다. 솔직히 자기보다 어린 사람이 위에 있으면 기분은 언잖을 수 있잖아? 하지만, 내 상사인 이유가 분명히 있는거다. 그걸 파악해내서 자신을 성장시켜라.
  면접에서는 '상사가 어리다고 해도 상사다. 회사는 상명하복의 사회다. 지시사항을 잘 수행한다. 원만한 인간관계를 유지하도록 노력한다.' 라고 했다.
  - 상사가 나에게 내가 싫어하는 일(내 생각은 '그건 아닌데')을 시킨다면?
  ㅡㅅ-)> 군대나 회사나 크게 다르지 않는다. 까라면 까는거다. 대신 시간적인 여유가 된다면, 내가 생각하는 차선책을 준비를 해두었다가, 일이 잘못되었을 경우, 슬며시 상사에게 건의를 할 수 있는 준비는 갖추어줘야 한다고 나는 생각한다. 그대로 말했다.

  제일 문제였던건 기술면접!! ㅡㅅ-)> 지금까지 5번 정도의 면접을 봤다. 인성적인 면으로 보는 면접들은 나의 '호감형' 얼굴로 먹고 들어가고 약간 더듬거리지만 내 나름의 확신을 담은 답변으로 무사통과를 했기 때문에, 몇번의 입사제의를 받은 사례를 남겼지만 취약한 부분은 기술면접 이었던 것이다. 기술면접의 핵심은 '자신있어하는 프로그래밍 언어에 대한 기본적인 개념을 이해하고 숙지하고 있느냐' 인것 같다.
 
여기서 나의 취약점이 드러난거다. ^ㅡ_-)>
  프로그래밍을 하면서 빠른 습득에 주안점을 두다보니까 내가 사용하는 클래스들에 대한 정확한 이해는 등한시했다는 것이다. 솔직히 인터넷 뒤져보고 API 문서만 잘 보면, 거기에 필요한 개념들이나 설명들이 있는데, 그걸 크지만 작은 용량의 내 머릿 속에 꾸깃꾸깃 밀어넣을 생각을 하지 않았다. 기술면접 시험에서는 그런 암기 후에 그걸 자신의 것으로 뱉어내는 능력을 요구하고 있었다. 어려운 문제들은 아니었다. 내가 교육과정에서 배운 개념, 프로그래밍, 방법 들에 대한 개념을 물어보고 있었다. 하지만 난 그것에 대해서 제대로 설명을 못하는 우를 범하고 말았다. 쩝....  이 점에 대해서 깊게 반성하면서 이제라도 필요한 개념들에 대한 숙지 작업에 들어가야겠다.

  기술면접과 관련된 내용은 스프링노트에 별도의 페이지를 만들어서 기록(http://sunfuture.springnote.com/pages/4131699)을 남겨야겠다. 이렇게 기록을 남기면서 머릿속에 남겨줘야지.


  그렇게 정신없이 기술 시험 면접까지 끝나고 면접관들에게 하고 싶은 말로 '면접할 수 있는 기회를 주셔서 감사합니다.' 라고 이야기 했습니다. 온화하신 모습으로 편안한 분위기에서 면접볼 수 있도록 해주신 것에 대단히 감사하다. ^^ 제 생각에는 '밑져야 본전'이라는 생각으로 응시를 했던 면접이었는데, 좋게 봐주신 거고 면접의 기회를 주신거니까 말이죠.

  면접을 마치고 밖으로 나오면서 다시한번 감사의 인사를 드리고 나와서 건물을 찍었다. 엘리베이터를 타고 내려가면서 지나고나서 후회할 때 하는 인상을 찡그리며 혀를 낼름 내밀 수밖에 없었습니다. 오늘 면접을 통해 제 부족한 부분을 깨닫고 레벨업을 목표로 레벨업노가다(자바 기본 개념 깨우치기)를 들어가야겠습니다.

  면접은 '창과 방패'의 싸움과도 같다고 생각을 합니다. 면접관은 자신의 공격을 잘 받아내는지 창으로 찌르는 공격자, 면접자는 면접관의 공격을 방패로 잘 받아넘기는 수비자의 역할을 가지고 있기도 합니다. 아직까지 면접을 보면서 제 자신의 기분이나 인격을 자극하는 면접관들을 만나지 않은 것은 저에게는 또다른 행운이 아닐까라고 생각합니다.
  이 글을 통해서 나마, 미흡한 저의 이력서를 보시고 면접의 기회를 주신 분들께 감사드립니다.


  저에게는 이렇게 높은 곳이었습니다. 즐거운 경험이었습니다.


  가을은 어느덧 성큼 내 곁에 다가와 있습니다.


그런데!! 왜 낮에는 더운건가요!? 우흡!!!

이렇게 허니몬의 ㈜잉카인터넷 기술면접 후기였습니다. ㅡㅅ-)> 기술면접시에 받은 문제지를 유출해보려 했는데 실패!!

내가 취업하지 못하는 것은 나에게 부족함이 많기 때문이다. 자신의 부족함을 깨달아가면서 나는 또 한단계 앞으로 전진!!

JAVA의 정석
카테고리 컴퓨터/IT
지은이 남궁 성 (도우출판, 2008년)
상세보기

  핸드북을 보면서 깨달은 것인데, Java 관련 기술면접 시험 준비용으로 핸드북이 효과적인 것 같다는 생각을 했다. 오호홋!! 물어봤던 것들이 그 안에 담겨있었다. ㅡㅅ-);;; 시험전 보는 요점정리 축약본이라고나 할까?? 원츄!! ㅎㅎ 핸드북만 팔아도 될듯.
1
블로그 이미지

Email : ihoneymon@gmail.com 안녕하세요, 꿀괴물 입니다. ^^ 멋진 비행을 준비 하는 블로그 입니다. 만능형 인간이 되어 많은 이들에게 인정받고, 즐겁고 행복하게 살기를 간절히 원합니다!! 달콤살벌한 꿀괴물의 좌충우돌 파란만장한 여정을 지켜봐주세요!! ^^

허니몬