반응형

원문 : The future of programming 

http://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS7197890408


점점 더 번역을 할 수록 어렵다는것이 느껴진다.

의미는 이해가 가는데 말로 표현하고 글로 작성하는 부분이 여전히 부족한 점이 많다.

여러번 퇴고를 해야하는데.. 핑계삼아서 반복을 못한것도 하나의 원인인것 같다.


"누가 읽더래도 이해하기 쉽게 번역을 하자"!!

----------------------------------------------------------------------------------------------------------------------------------------------------------------------


프로그래밍은 변화하고 있습니다. PC의 시대가 끝나고 소프트웨어 개발자들의 시대가 오고 있습니다. 그들은 수많은 장비와 업무 기능들, 그리고 기종에 따라 다른 접근방법들이 필요한 문제점들을 해결하고 있습니다. 데이터가 증가하는 지금 시대에, 많은 종류의 프로그래밍을 할 수 있는 능력은 모든 분야에서 점점 중요하게 여겨지고 있습니다. 그리고 프로그래밍도 더 이상 엔지니어 영역이라는 인식도 사라지고 있습니다. 

 앞으로 몇 년에 걸쳐, 저는 프로그래밍이 변화해 가는 모습과 그것이 영향을 미치는 요인을 연구해 보려고 합니다. 그리고 이 기사는 그러한 몇 가지 영향력에 대해 다루고 있습니다. 이러한 변화에 대한 의견이나 같이 할 연구할 의사가 있다면 언제든지 알려주기 바랍니다. 

우선 무엇을 먼저 해야 할까요? 목표는 다가올 10년동안 프로그래머들이 필요한 필수적인 기술과 그들이 우선시 해야 할 교육, 그리고 단기간의 경향과 장기적 변화간의 차이에 대해 서술하는 데에 있습니다. 

분산 컴퓨팅 

오늘날에 "평범한" 환경에서 개발을 한다는 것은 10년전과는 의미가 달라졌습니다. 웹 애플리케이션이나 모바일 또는 빅 데이터와 같은 환경이 생기면서 프로그램이 오직 한대의 컴퓨터에서만 사용한다는 생각은 바뀌게 되었습니다. 

그렇게 되면서 프로그래머들은 동시성, 락, 비동기 네트워크 통신, 프로토콜과 같은 문제들을 처리 하게 되었습니다. 가장 기본적인 웹 프로그래밍을 할 때라도 캐싱과 같은 친근한 문제와 마주치게 될 것입니다. 

이러한 문제들과 관련해서 우리는 컴퓨팅 스택에 있는 단계별 현상들을 볼 수 있습니다. 

상위 단계인 클라우드 컴퓨팅은 다양한 기계와 네트워크를 유지하는데 발생하는 번거로운 상황을 줄이기 위한 방법을 찾고 있습니다. 애플리케이션 개발 단계에서는 익숙한 패턴을 사용하여 프레임워크를 구현하고 복잡한 세부 내용들을 추상화하고 있습니다. 그리고 개발 언어 단계에서는 Go나 Scala 같은 언어가 제공하는 기능에 의해 동시성이나 네트워크 컴퓨팅이 좀더 간단해 지고 있습니다. 

디바이스 컴퓨팅 

주위를 둘러보면 당신이 가지고 있는 모든 전자 제품에는 프로세서와 프로그램을 가지고 있습니다. 그리고 당신의 컴퓨터 또한 그 중에 하나입니다. 모든 사람들이 제품에 내장된 프로그램에 관심을 갖지는 않지만 많은 개발자들은 분명히 모바일 폰으로 개발하기 위한 방법이 무엇인지 배워야 합니다. 가까운 미래에 자동차나 무인항공기안경스마트 더스트에 적용시켜야 할 수도 있습니다. 

심지어 기존의 컴퓨터 사용에서도 다양한 고급 데이터를 고속으로 처리하는 보조 프로세서로 GPU 수가 늘어나게 되면서 기존과 다른 프로그래밍이 필요해졌습니다. 다른 형태의 요인들은 다른 방법의 프로그래밍 접근을 요구하게 되었고 Hobbyist와 prototype들은 비슷하게 Arduino와 Processing이라는 하드웨어를 도입하게 되었습니다. 그리고 프로그래밍 언어들과 프로그래머들은 메모리의 부족, CPU 속도, 파워 소비, 주파수 통신, 실시간 처리 등과 같은 특별한 분야의 이슈들에 대해 미리미리 대응 해야만 했습니다. 

데이터 컴퓨팅 

오늘날 많이 사용하는 객체 지향 프로그래밍은 일반적으로 데이터에 적대적입니다. 이 방법은 접근하는 메소드를 통해 데이터를 감싸는 행위에 초점을 맞추고 있기 때문에 이전보다 데이터를 더 타이트하게 보호하게 됩니다. 수학적인 의미로 데이터는 행동이 없는 말 그대로 데이터에 불과하지만 C++이나 java와 같은 영역에서 개발자들은 데이터의 접근 방법에 대해 생각해야만 합니다. 

데이터와 데이터 분석의 중요성이 커짐에 따라 first class citizen 처럼 데이터를 처리하는 언어들의 인기와 사용이 증가하게 되었습니다. 그리고 분명히 R과 같은 통계적인 언어들도 이러한 흐름에 따라 사용이 증가하고 있습니다. 하지만 일반적으로 프로그래밍의 목적면에서 Python이나 Clojure가 데이터를 다루는데 더 쉽다는 의견이 대부분을 차지하고 있습니다. 

보편화된 컴퓨팅 

점점 많은 사람들이 프로그래밍을 하고 있습니다. 이 영리하고 수많은, 돌발적인 개발자들은 엑셀 매크로의 마법과 같은 기능과 자바스크립트 기술, IFTTT 또는 Zapier와 같은 웹 서비스를 지원하는 것들에 골머리를 앓고 있습니다. 그들은 소프트웨어 개발에 대해 약간 알고 있긴 하지만 그 이상 관심을 갖고 있지는 않기 때문이죠. 

이렇게 무심한 프로그래머들은 쉽게 문제들을 발생시키고 오랫동안 이런 문제들이 해결될 때까지 곤경에 빠지게 됩니다. 아무리 낙관적으로 생각해도 이건 짜증스럽고, 최악의 경우에는 고용주에게 책임을 묻는 경우도 발생하게 됩니다. 게다가 이건 프로그래머의 잘못도 아닙니다. 

프로그램이 작동 가능한 환경을 제공하는 사람들은 어떻게 더 나은 "돌발적인 개발자" 를 찾을 수 있을까요? 우리는 기존의 언어보다 새로운 개발 언어와 더 나은 프레임워크를 사용해야만 할까요? 이건 교육적인 문제인걸까요? 아니면 이건 문제가 아니라 단지 시기상의 문제일까요? 

Bre Victor"s work와 ScratchLight Table과 같은 프로젝트에서 다른 미래에 대한 힌트를 얻을 수 있습니다. 

위험한 컴퓨팅 

마침내, 우리가 소프트웨어 개발에 대한 지금의 접근 방법으로 만든 불안정한 계획을 시험해볼 가치가 있게 되었습니다. 두뇌가 오직 두뇌 안에서 풀 수 있는 문제들만 해결 할 수 있듯이 문제는 단순합니다. 오늘날 프로그래머가 되기 위해서는, 머릿속으로 생각해서 만든 프로그램을 실행시킬 수 있는 능력을 갖춰야 합니다. . 

만약 문제에 대한 영역이 점점 커지면 프레임워크를 사용해서 문제에 대한 영역을 줄이면 됩니다. 우리는 CPU 위에 운영체제를 설치하고 라이브러리들과 사용자 인터페이스들은 운영체제 위에서 실행합니다. 그리고 애플리케이션 프레임워크는 이들 라이브러리 위에서 실행되고, 웹 브라우저는 프레임워크 위에서 실행됩니다. 그리고 자바스크립트는 브라우저 위에서 실행되고 자바스크립트 라이브러리는 자바스크립트 위에서 실행됩니다. 여기에서 끝이 아닙니다. 

우리는 다른 쪽 위에 한 개의 찻잔을 쌓아 올리는 야심찬 웨이터와 같습니다. 바로 지금은 약간 흔들려 보일지도 모릅니다. 우리는 더 빠르고 강력한 CPU를 만든 것이 아니라 지난 10년전에 만들었던 같은 종류의 애플리케이션을 만들었을 뿐입니다. 그리고 결국 수많은 시스템들을 위험으로 몰아놓는 보안상 문제점을 프레임워크 상에 만들어 냈습니다. 

왜 우리는 컴퓨터를 사용하면서 불안한 문제점들을 만들고 프로그래머가 컴퓨터의 능력을 그들의 머리에서 활용할 수 있는 정도로만 국한시킬까요? 이런 소프트웨어의 관점을 바꿀 수 있는 방법이 있을까요? 

결론 

나는 미래의 프로그래밍을 연구하면서 이러한 트렌트를 지켜볼 것입니다. 만약 경험이나 관점을 가지고 있거나 다른 방법으로 연구를 하고 계신 분들이 있다면 의견을 듣고 싶습니다. 그리고 이 기사에 대한 의견을 남겨주면 감사하겠습니다.

728x90
반응형
반응형

  1. SELECT 컬럼,
  2.         LTRIM(sys_connect_by_path(컬럼,','),',') AS 컬럼명
  3. FROM  (
  4.         SELECT 컬럼,
  5.         menurole_id,
  6.         row_number() OVER (partition BY 그룹컬럼 ORDER BY 정렬할컬럼) rn,
  7.         COUNT (*) OVER (partition BY 그룹컬럼 ) cnt
  8.         FROM 테이블명
  9. )
  10. WHERE level = cnt
  11. start WITH rn = 1
  12. connect BY prior 그룹컬럼 = 그룹컬럼 AND prior rn = rn-1
유용하니 적어놔야지 ㅎㅎ

이것으로 응용하면 트리로 만들수 도 있다!!

728x90
반응형
반응형

CREATE SEQUENCE sequence_name
       [INCREMENT BY n1]
       [START WITH n2]
       [MAXVALUE n3 or NOMAXVALUE]
       [MINVALUE n4 or NOMINVALUE]
       [CYCLE or NOCYCLE]
       [CACHE or NOCACHE];


sequence_name ....... 생성하고자 하는 시퀀스 명
INCREMENT BY n1 ... 해당 시퀀스의 증가값을 지정한다. 생략하면 1로 지정됨.

                                오름차순 : 양의 정수, 내림차순 : 음의정수 사용
START WITH n2 ........ 해당 시쿼스가 처음 시작하는 값을 지정한다. 생략하면 1로 지정됨.
MAXVALUE n3 ......... 해당 시퀀스가 생성할 수 있는 최대값,
NOMAXVALUE ......... 오름차순 최대 10의 27승 까지, 내림차순 -1 까지 생성됨.
MINVALUE n4 .......... 해당 시퀀스가 생성할 수 있는 최소값
NOMINVALUE .......... 오름차순 1 까지, 내림차순 -10의 26승 까지
CYCLE ................... 해당 시퀀스가 최대값에 도달한 후 다시 처음부터 시퀀스를 생성한다.
NOCYCLE ............... 해당 시퀀스가 최대값에 도달해도 다시 생성하지 않는다.[DEFAULT]
CACHE ................... 시퀀스 값을 메모리에 할당하여 처리한다. [ORACLE DEFAULT 20]
NOCACHE ............... 시퀀스를 메모리에 할당하여 사용하지 않음.


예)

CREATE SEQUENCE  TEST_SEQ  

        INCREMENT BY 1

        START WITH 1 

        MAXVALUE 99999999999

        NOCYCLE

        NOCACHE;


SELECT TEST_SEQ.NEXTVAL FROM DUAL;


사용자가 만든 시퀀스 조회

SELECT * FROM USER_SEQUENCES;

728x90
반응형
반응형

발췌 대상 테이블을 참조한다. (FROM)

발췌 대상 데이터가 아닌 것은 제거한다. (WHERE)

행들을 그룹화 합니다. (GROUP BY) → GROUPPING

그룹함수의 값의 조건에 맞는 것만을 출력한다.(HAVING)

데이터 값을 계산한다. (SELECT)

데이터를 특정 칼럼을 기준으로 정렬한다. (ORDER BY)


앞으로 쿼리 작성할때 염두해 둬야겠다. 

728x90
반응형

'Development > DataBase' 카테고리의 다른 글

[Oracle]select 세로를 가로로 뿌리기  (0) 2013.02.12
[Oracle]시퀀스 만들기  (0) 2013.02.12
SQL 작성시 주의사항  (0) 2013.02.12
[Oracle]계층구조 가져오기  (0) 2013.02.12
[SQL]REGEXP_SUBSTR  (0) 2011.12.20
반응형

조건 칼럼에 연산이 필요한 경우는 칼럼을 변형시키는 연산 대신에 비교되는 상수 값을변형시키는 방법을 찾아야 한다. 컬럼을 변형시킬경우 Index가 존재해도 Full Scan을 하게된다.


SUBSTR(ENAME, 1,1) = '이'  -> ENAME LIKE '이%'

SAL * 12 > 30000000            -> SAL > 30000000 / 12

TO_CHAR(BIRTH,'YYYYMMDD') = '20020909'   -> BIRTH = TO_DATE('20020909','YYYYMMDD')


2. NULL은 인덱스에 들어가지 않기 때문에 인덱스를 스캔할 필요가 없다. 따라서 NULL 비교 조건을 상수 조건으로 변경해야한다. 


name is null ->  name > ''    (VARCHAR2)

age is null   ->  age > 0       (NUMBER)


3. NOT operator를 조건으로 사용한 경우는 부정형 조건을 긍정형으로 변경하면 인덱스 스캔을 할 수 있다.

position <> 'MF'     ->  position < 'MF' OR position > 'MF

728x90
반응형

'Development > DataBase' 카테고리의 다른 글

[Oracle]시퀀스 만들기  (0) 2013.02.12
SQL 문 수행단계  (0) 2013.02.12
[Oracle]계층구조 가져오기  (0) 2013.02.12
[SQL]REGEXP_SUBSTR  (0) 2011.12.20
[Oracle]세로 data를 가로로 변형하기 - LISTAGG  (0) 2011.11.08
반응형
  1. SELECT
  2.    SYS_CONNECT_BY_PATH(ITM_NM,'>>')   HRCH_FULL_NM       -- 전체계층구조(이름)
  3. FROM  TABLE
  4.  
  5. WHERE ITM_CLSF_CD = '12131804'
  6. START WITH ITM_CD IS NULL
  7. CONNECT BY PRIOR ITM_CD  =  PARENT_ITM_CD

이렇게 쿼리를 작성하면


계층구조는 
ITEM >> ITEM >>  ITEM
이런 형식으로 나오게 된다.

START WITH ITM_CD IS NULL

ITM_CD IS NULL : ITM_CD 가 NULL 인것을  ROOT로 인식한다.

CONNECT BY PRIOR ITM_CD  =  PARENT_ITM_CD 

ITM_CD  =  PARENT_ITM_CD  : 하위코드와 상위코드의 관계를 정의한다.

728x90
반응형

'Development > DataBase' 카테고리의 다른 글

SQL 문 수행단계  (0) 2013.02.12
SQL 작성시 주의사항  (0) 2013.02.12
[SQL]REGEXP_SUBSTR  (0) 2011.12.20
[Oracle]세로 data를 가로로 변형하기 - LISTAGG  (0) 2011.11.08
[Oracle]ORDER BY 절에서 NULL 값 위치 지정  (0) 2011.09.26
반응형

맬리드네시아(Malidnesia)의 고대 희극인들은 비극보다 희극을 선호한다. 불행히도 고대 연극의 대부분은 비극이다. 따라서, ACM의 드라마 작가는 몇 편의 비극을 희극으로 바꾸기로 결정한다. 극의 모든 것을 반대로 바꿔야 함에도 불구하고 극의 기본 의미를 보존해야 하기 때문에 이 작업이 매우 어렵다는 것은 분명하다. 숫자를 예로 들어보자. 비극에서 어떤 숫자가 나타나면 희극에서 사용하기 전에 이 숫자를 거꾸로 변환해야 한다. 
거꾸로 쓴 숫자(Reversed number)라는 것은 비트 순서를 반대로 하는 것이 아니라 아라비아 숫자를 반대로 쓰는 것을 의미한다. 첫번째 자리가 마지막이 되고, 마지막이 첫번째가 되는 것이다. 예를 들어, 주인공이 비극에서 1245 딸기(1245 strawberries)이면, 희극에서는 5421 딸기가 된다. 자리채움 0은 생략된다. 즉, 0으로 끝나는 숫자를 반전하게 되면 0은 사라진다.(예를 들어, 1200을 바꾸면 21이 된다). 또한, 반전된 숫자는 0으로 끝나는 경우가 없다. 
ACM은 반전한 숫자를 계산해야 한다. 여러분의 작업은 반전한 두 수를 더한 합계를 구하고, 이 합계를 다시 반전하여 출력하는 것이다. 물론, 어떤 숫자들은 순서를 바꿔쓰면 같은 수가 되기 때문에 결과가 항상 유일한(unique) 것은 아니다.(예를 들어, 12, 120, 1200은 바꿔 쓰면 모두 21이 된다) 따라서, 반전했을 경우 0이 사라지는 경우는 없다고 가정해야 한다. (즉, 반전된 수가 21이면 원래 숫자는 12라고 가정하는 것이다)

 

입력

입력은 경우의 수 N이다. 입력의 첫번째 라인은 양의 정수 N만 입력한다. 그 다음에 각 케이스를 입력한다. 각 줄에는 두 개의 정수를 공백으로 구분해서 입력한다. 이 숫자들의 순서를 바꿔서 덧셈을 해야 한다. 숫자는 최대 200자까지 될 수 있다.

출력

각 케이스에 대해서 한 줄에 하나의 정수를 출력한다. 이 정수는 반전한 두 수의 합이다. 출력에서 자리 채움 0은 모두 생략한다

입력예제

3
24 1
4358 754
305 794

출력예제

34
1998
1

  1. import java.io.*;
  2. import java.util.StringTokenizer;
  3. public class AddingReversedNumberMain {
  4.  public static void main(String[] args) throws IOException{
  5.   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  6.   String[][] temp = null;
  7.   int caseNum = 0;
  8.   StringTokenizer st = null;
  9.   int[] sum = null;
  10.   AddingReversedNumber arn = new AddingReversedNumber();
  11.   System.out.print("inout case : " );
  12.   caseNum = System.in.read() - 48;
  13.   System.in.read();
  14.   System.in.read();
  15.  
  16.   temp = new String[caseNum][2];
  17.   sum = new int[caseNum];
  18.  
  19.   for (int i = 0; i < caseNum; i++){
  20.    System.out.print(i + ". caseSet : ");
  21.    String str = in.readLine();
  22.    
  23.    st = new StringTokenizer(str, " " );
  24.    for (int j = 0; j < 2; j++){
  25.     temp[i][j] = st.nextToken();
  26.     sum[i] = sum[i] + arn.reverseNumber(temp[i][j]);
  27.    }
  28.   }
  29.  
  30.   for (int i = 0; i < sum.length; i++){
  31.    System.out.println(arn.reverseNumber(Integer.toString(sum[i])));
  32.   }
  33.  }
  34.  
  35. }
  36. public class AddingReversedNumber {
  37.  public int reverseNumber(String num){
  38.   StringBuffer sb = new StringBuffer();
  39.   String temp = null;
  40.   int len = num.length()-1;
  41.   int number;
  42.  
  43.   for (int i = len; i >= 0 ; i--){
  44.    sb.append(num.charAt(i));
  45.   }
  46.  
  47.   temp = new String(sb);
  48.   number = Integer.parseInt(temp);
  49.   return number;
  50.  }
  51. }

728x90
반응형

'Development > Algorithm' 카테고리의 다른 글

에라토스테네스의 체  (0) 2016.12.07
[Try-catch]대문자 출력  (0) 2013.11.04
[Hacker Cup]Find the Min  (0) 2013.02.01
[Hacker Cup]Balanced Smileys  (0) 2013.01.31
[Programming Challenges] The 3n+1 Problem  (0) 2011.09.01
반응형

1. 오버라이딩 할때에는 접근 제한자의 범위가 같거나 커야한다.

 

2. 오버라이딩 된 하위 클래스의 메서드에 throws 구문이 있으면 상위 클래스의 오버라이딩을 준 메서드도 반드시 해당 예외 클래스에 준하는 throws 구문이 있어야 한다.

 

맨날 오버로딩하고 헷갈리는 오버라이딩

규칙도 있다는것을 처음 알았다

 

참고로 오버 로딩은 매개변수가 다르거나 매개변수의 자료형이 틀린 동일한 메서드를 말한다.

까먹지 말아야지..

728x90
반응형
반응형

음.. 미묘한 내용이라 잘 이해가 되실지 모르겠습니다만..

좀 전문적인 관점에서 설명을 해드리겠습니다.
(어려운 내용이지만 오히려 이편이 이해가 더 빠를 수도 있을거 같아서요)

먼저 객체란 것은 무엇이고 변수란 것은 무엇인가?
그냥 다 그냥 값을 저장하는 공간 아닌가?

객체는 힙(heap)이라는 메모리 영역에 생성됩니다.
힙은 프로그램(프로세스 process)이 실행되는 동안
무언가 저장할 공간이 필요할 때 사용되는 메모리 공간입니다.

변수는 스택(stack)이란 메모리 영역에 생성됩니다.
스택은 쓰레드(thread)가 실행되는 동안 사용되는 영역입니다.
(쓰레드란거에 대해서 이해를 하셨는지 모르겠습니다만)

하나의 프로세스에는 여러개의 쓰레드가 있을수 있습니다.
각 쓰레드는 고유의 스택영역을 가지지만
하나의 프로세스 내에서는 힙(heap)은 공유해서 사용합니다.

왜 이렇게 나눠져 있느냐?
스텍 영역은 프로그램 코드와 밀접한 관계가 있습니다.
크기가 고정적일 수 밖에 없습니다.(컴파일 할때 고정됩니다. 이걸 '컴파일 타임'이라고 합니다.)
프로그램 실행중에 크기가 변경될 수있거나 결정되는 것들은 힙에 저장해야 합니다.
(이걸 '런 타임'이라고 합니다.)

그리고 또한가지
스택은 쓰레드간에 격리된 공간이기 때문에 여러 쓰레드에서 사용하려면 힙에 저장해야 합니다.

그러면 스택은 무시하고 힙만 쓰면 되지 않느냐?
힙 영역에 어떤 데이터가 존재한다고 하더라도 프로그램에서 바로 그 값을 사용할 수가 없습니다.
합은 구획되지 않은 그냥 커다란 공간일 뿐입니다.

스택의 데이터는 이름(실제로는 상대주소)을 통해서 쉽게 접근이 가능하지만
힙의 데이터는 메모리 주소값으로 사용해야 합니다.

즉 힙에 데이터를 저장할 때는 몇번지에 저장했는지 메모리 주소값을 따로 기억하고 있어야합니다.
어떻게 기억하느냐? 스택 변수에 저장해서 기억합니다.

다음으로 넘어가기 전에 잠시 정리하면 대충 다음과 같습니다.

객체 = 힙 = 메모리 주소를 따로 보관해야함
변수 = 스택 = 그냥 이름으로 쓰면됨


여기까지는 대충 그렇구나 하시면 됩니다.
지금부터 코드를 작성하면 그게 실제로 어떻게 동작하는지
차근차근 설명해 드리도록 하겠습니다.


어떤 함수 안에서

void someMethod() {
int a;
...
}

라고 선언했다면 이것은 스택 영역에 int 크기(4바이트져)만큼의 공간이 할당되고 a라고 이름 붙여집니다.

만약 어떤 순간에 someMethod()가 2개가 동시에 실행되고 있었다면(2개의 쓰레드에서)
스택영역도 2개가 되고 a 도 2개가 존재하는 겁니다.

어떤 함수 안에서

void someMethod() {
String s;
...
}

라고 선언했다면 스택영역에 참조(reference)형 변수가 생성되고 s라고 이름이 붙여집니다.
참조형 변수란것이 바로 힙영역에 대한 메모리 주소입니다.

자바에서 참조(reference)란 힙 영역의 객체에 대한 메모리 주소를 유식하게 말하는 것입니다.

다시 코드에서 보면 메모리 주소를 저장할 공간은 만들었지만
s에 실제로 주소를 지정하지는 않았습니다.
이 상태를 null 이라고 합니다. 따라서 s == null 입니다.

null 이란 참조형 변수가 있는데 거기에 메모리 주소가 저장되어있지 않은 상태를 말합니다.
(정확하게 말하면 0번지라는 값을 의미합니다.)

void someMethod() {
String s = new String("1234");
...
}

라고 했다면 힙에 "1234"가 저장될 메모리 공간이 생성되고, 스텍에는 s라는 참조형 변수가 생깁니다.
그리고 "1234"의 주소값이 s에 저장됩니다.

s에는 주소 값이 저장되어있으므로 s != null 입니다.

void someMethod() {
String s = new String("1234");
...
s = null;
...
}

만약 s에 null이란 값을 대입하게 되면 s에는 0번지란 값이 저장되고
조금전에 생성된 "1234" 객체에 대한 메모리 주소값은 어딘지 알 수 없게 되어버립니다.
그래서 다시 "1234"를 사용할 수 없게 되죠.

이것을 객체 참조를 끊는다라고 말합니다.
힙에 할당되어있지만 그 주소를 담고 있는 참조 변수가 하나도 없는 경우
즉 모든 참조가 끊긴 경우 자동으로 메모리가 해제되고
다시 사용할 수 있는 공간으로 바뀝니다. (이것을 가비지 컬렉팅이라고 합니다.)


void someMethod() {
String s1 = new String("1234");
String s2 = new String("1234");
...
}

라고 했다면 힙에 "1234"가 생기고 그 주소값이 스택의 s1 에 저장됩니다.
그리고 또다시 힙에 "1234"가 생성되고 그 주소값이 스택의 s2 에 저장됩니다.

힙에는 "1234"가 2번 생겼습니다.
따라서 s1과 s2는 서로 다른 메모리 주소를 가지게 됩니다.

그렇기 때문에 s1 != s2 인것이죠.
하지만 s1.equals(s2) 는 true 입니다.
그 이유는 String의 equals()는 힙에 들어있는 실제 문자열 데이터를 비교하기 때문입니다.

참고로 말씀드리자면 equals()는 힙에 있는 객체의 값을 비교하기 위한 메쏘드입니다만
모든 객체의 디폴트인 Object.equals() 는 == 연산자와 동일하게 동작합니다.
객체를 만들 때 자신의 객체에 맞게 equals() 메쏘드를
재정의 해야 String.equals()처럼 올바르게 값을 비교할 수있게 됩니다.

길게 설명했는데 잘 모르겠으면 그냥 무시하십쇼^^
언젠가는 이해가 될겁니다.
 
출처 : 네이버 지식IN 답변(dagui0님)

728x90
반응형

'Development > Java' 카테고리의 다른 글

ExecutorService  (0) 2013.03.22
오버라이딩 규칙  (0) 2013.02.12
Deep Copy vs Shallow Copy  (0) 2013.02.12
객체에는 메서드가 포함되지 않는다?  (0) 2013.02.12
파일 입출력.  (0) 2013.01.29

+ Recent posts