블로그 이미지
'무른모'란 부드럽다라는 뜻을 가진 '무르다'라는 말과 도구, 연장을 뜻하는 '연모'라는 순 우리말의 합성어로 소프트웨어를 말합니다. seanhigher

카테고리

분류 전체보기 (161)
Blog srart (16)
Dev Center (94)
Real Life (13)
Mac life (21)
Naver life (17)
Total633,817
Today41
Yesterday88
클래스 형태의 데이터 타입을 사용하게 되면 또 하나의 막강한 기능을 사용할 수 있다. 상속을 통한 확장과, 다양한 형변환을 통해, 언제 어떤 형태로든 데이터를 사용하는 것이 가능해 진다. 물론, 변환하고자 하는 데이터형에 알맞아야 한다는 불변의 조건이 있지만...



데이터 형변환하는 캐스팅.
자바의 기본 데이터에서는 캐스팅을 통해 더 큰 형태의 데이터로 형변환을 하는 것이 가능하다. 이것은 클래스를 사용하는 데이터 형에서도 사용이 가능하다. '사람' 이라는 클래스와 이것을 확장하는 '학생' 이라는 클래스 데이터형이 있다면, '학생' 이라는 클래스 데이터는 '사람'이라는 데이터 형태로 형변환이 가능하게 된다.

학생 홍길동 = new 학생();
사람 사람1 = (사람)홍길동;

서로 다른 데이터 형이지만, 동일한 데이터 형으로 취급하여 사용하는 것이 가능하게 된다. 그리고 위에서 만든 홍길동은 '사람' 이외에도 'Object' 형태로의 형변환이 가능한데, 이것은 모든 클래스가 기본적으로 Object 를 상속받아 만들어졌기 때문이다. (자바 API 를 보면 모든 클래스가 Object 를 상속받는 다는 걸 알 수 있다.) 그렇기 때문에 모든 데이터형을 한꺼번에 처리하고자 한다면, 'Object' 의 형태로 데이터를 선언하고 사용하면 될 것이다. 하지만, 그만큼 안정성은 보장하지 못한다는 사실도 기억해야 한다.


강제적인 캐스팅 확인하기, instanceof 연산자.
사실 위와 같이 하위 클래스에서 상위 클래스로의 형변환은 궂이 선언하지 않아도 자동으로 상황에 맞추어 형변환이 이루어진다. 반대로, 하위로 형변환을 하게 될 경우에는 꼭 원하는 데이터 형으로 형변환을 선언해 주어야 한다. 하지만, 이리저리 데이터들이 이동을 하고 자주 형변환이 이루어지는 과정에서 이 데이터가 내가 생각하는 데이터가 맞는지 고민을 하게 되는 경우가 생기기도 한다. 이럴때 사용할 수 있는 것이 instanceof 연산자이다. 이것은 대상 데이터가 비교하고자 하는 데이터 형태로 형변환이 가능한지는 확인해주는 역할을 하게 된다. '사람' 타입으로 변형된 '홍길동' 을 다시 학생으로 돌려놓고 싶은데, 그것이 가능한지 알고 싶다면 다음과 같은 방법을 사용할 수 있다.

if(홍길동 instanceof 학생)
    학생 새홍길동 = (학생)홍길동;

이런 클래스의 형변환은 다양한 데이터를 좀더 효율적으로 사용할 수 있도록 해준다. '사람1' 과 '홍길동' 은 서로 다른 데이터 형으로 만들어 졌지만, 형변환으로 통일된 데이터 형을 가짐으로써 하나의 로직으로 좀더 많은 데이터를 수용하는 것이 가능해지는 것이다.

Posted by seanhigher

댓글을 달아 주세요

1. 문자열 td1 = "<td>    df  34 56 78 12 , 34 45 gffhg 345 456 76 76  sadlf</td>" , td2 = "<td>df  34 56 78 12 , 34 dfg 345 :456 76 76  90</td>" 일때 이 문자열 안에 포함된 수의 평균을 구하는 메소드를 구현할 것. 메소드 average(String) 는 int 형 값을 반환한다.
2. 문자열 alpha = "abcDEfGHijKLmnOPQrstuvWXyz" 이 메소드 reverseString(String) 의 작업을 거치면 소문자는 대문자로, 대문자는 소문자로 변환되며 문자열의 순서를 역순으로 String 값을 반환한다.

Devist's think!



Source


Answer


'Dev Center > ThinkBig' 카테고리의 다른 글

텍스트 파일에 포함된 단어의 갯수 세기.  (0) 2010.07.27
쓰레드를 보호하는 방법?  (0) 2010.07.11
멀티 쓰레드에서는 어떻게 될까?  (0) 2010.07.09
String API 활용  (0) 2010.07.07
피보나치 수열  (2) 2010.07.06
특이한 분수 찾기  (0) 2010.07.05
Posted by seanhigher

댓글을 달아 주세요

자바에서의 자료들은 각 상황에 맞게 자동으로 변환된다는 프로모션의 특징을 가지고 있다. 그중에서도 'char' 의 형태는 더욱 특별하다. 자료를 나타낼 수 있는 형태가 무려 세가지에 달하기 때문!! 각 상황에 맞게 사용하지 않는다면 원하지 않는 결과를 얻을 수도 있다. 그런일이 그렇게 많지는 않지만....


'char' 형태로 나타내는 방법.
'char' 의 형태로 나타낼 수 있는 방법은, 유니코드, ASCII 코드, 문자의 세가지 방법이다. 가장 쉽게 사용할 수 있는 방법으로 다음과 같이 한 문자를 표현할 때 사용하게 된다.

char c = 'a';

중요한것은 꼭 홑 따옴표로 한 문자를 감싸 주어야 한다는 것이다. 만일 따옴표를 표시하지 않는다면 문자 'a' 대신에 'a'를 나타내는 아스키코드인 97이 변수 c 에 대입이 될 것이다. 하지만, 출력을 할 때 그 형태를 문자의 형태로 나타낸다면 아무런 문제 없이 'a' 라는 문자를 출력하게 될 것이다. 좀더 다른 이야기를 하자면, char 형은 하나의 문자로 나타낼 수도, 아스키코드내의 숫자의 형태로도 나타내는 것이 가능하다. 저장될때는 모두 문자의 형태를 갖지만, 출력하는 상황에 따라 그렇게 변환하는 것이 가능한 것이다.

public class Char {
    public static void main(String[] args) {
        char ch1 = '\u0061';
        char ch2 = 97;
        char ch3 = 'a';
        system.out.println("unicode : " + ch1);
        system.out.println("ASCII : " + ch2);
        system.out.println("character : " + ch3);
    }
}

위의 프로그램을 실행하면 다음과 같은 결과를 얻게 된다.

unicode : a
ASCII : a
character : a

똑같은 a 를 출력하는 것이지만, 다양한 방법으로 표현이 가능하다는 것이다.

아스키 코드를 사용하는 이유!
'char' 의 자료형은 아스키코드의 형태를 나타낼 수 있다. 하지만, 아스키코드나 유니코드같은 형태가 왜 필요한 것일까? 이것은 컴퓨터가 이진수 형태의 모습을 가지고 있기 때문이다. 우리가 이해할 수 있는 언어를 그대로 사용한다면 컴퓨터는 이해를 할 수 없는 것이다. 이것을 컴퓨터가 이해하기 위한 하나의 방법으로 10진수의 아스키코드나 16진수의 유니코드와 같은 형식이 필요한 것이다. 마치 우리가 영어를 이해하기 위해서 'I' 라는 단어가 '나' 를 표현하는 말이라는 것을 알아야 이해할 수 있는 것처럼 말이다.


ASCII code table
아스키코드는 컴퓨터와 의사소통의 기능 외에도, 키보드로 표현할 수 없는 표현들을 컴퓨터에 쉽게 전달해 줄 수 있는 방법이 되기도 한다. 키보드로 엔터를 친것과 같은 효과나, 탭키를 누른듯한 효과등을 코드값으로 대입해 놓음으로써 어느 기종에서나 동일하게 입력이 가능하게 되는 것이다.

 0  NULL  20  SC4  40  (  60  <  80  P  100  d  120  x
 1  SOH  21  NAK  41  )  61  =  81  Q  101  e  121  y
 2  STX  22  SYN  42  *  62  >  82  R  102  f  122  z
 3  ETX  23  ETB  43  +  63  ?  83  S  103  g  123  {
 4  EOT  24  CAN  44  '  64  @  84  T  104  h  124  |
 5  ENQ  25  EM  45  -  65  A  85  U  105  i  125  }
 6  ACK  26  SUB  46  .  66  B  86  V  106  j  126  ~
 7  BEL  27  ESC  47  /  67  C  87  W  107  k  127  DEL
 8  BS  28  FS  48  0  68  D  88  X  108  l    
 9  HT  29  GS  49  1  69  E  89  Y  109  m    
 10  LF  30  RS  50  2  70  F  90  Z  110  n    
 11  VT  31  US  51  3  71  G  91  [  111  o    
 12  FF  32  SP  52  4  72  H  92  \  112  p    
 13  CR  33  !  53  5  73  I  93  ]  113  q    
 14  SO  34  "  54  6  74  J  94  ^  114  r    
 15  SI  35  #  55  7  75  K  95  _  115  s    
 16  DLE  36  $  56  8  76  L  96  .  116  t    
 17  DC1  37  %  57  9  77  M  97  a  117  u    
 18  SC2  38  &  58  :  78  N  98  b  118  v    
 19  SC3  39  '  59  ;  79  O  99  c  119  w    
표1. 아스키 코드표

'char' 의 형태는 기본적으로 문자의 형태로 기억되기 때문에, 숫자로 형변환하여 사용하기 위해서는 숫자 '0' 을 나타내는 -48 을 계산해야 원하는 숫자의 값을 얻을 수 있다. 이 역시 한자리 숫자만 가능하다는 것을 기억해야 한다.
Posted by seanhigher

댓글을 달아 주세요

프로그래밍에서 다양한 데이터형을 사용하다보면 그 형태를 바꾸어야 할 경우가 있다. 문자의 형식으로 데이터를 입력했는데, 이것을 정수의 형태로 바꾸어야 한다면?? 자바에서는 가능하다면 자동으로 바꾸어준다. 하지만, 그렇지 않은 경우도 있다.


작은곳에서 큰곳으로는 자동으로! promotion.
자바는 생각보다 똑똑한 언어이다. 사용자가 알지 못하지만, 문제가 일어나지 않는 가능한 범위내에서 자동으로 이루어지는 것들이 많다. 프로모션의 형변환 같은 경우가 대표적이다. 만일 byte 형의 데이터가 있다고 하고, 이것을 short 형의 데이터에 넣고자 한다면...?

byte a = 10;
short b = a;

아무런 문제없이 프로그램이 실행되는것을 알 수 있다. 분명 다른 자료형이지만, 1byte의 공간을 가진 byte로 선언된 'a'를 2byte의 공간을 가진 short 형으로 선언된 'b'속에 담는 것은 크게 문제가 되는 일이 아니기 때문에 자동으로 변환이 이루어지는데 이것이 프로모션 기능이다. 하지만 한가지 기억해야 할것이 있다.

char a = 65;
short b = a;

위의 경우에는 문제가 발생하게 된다. char 의 경우는 2byte의 공간을 가지고 있고, short 의 경우 역시 2byte의 공간을 가지고 있다. 동일한 공간을 가진 데이터 형이라면 문제가 없다고 생각할 수 있겠지만, 서로 표현하는 공간이 다르다는 것이 문제의 원인이 된다. char의 경우는 0~65535 까지의 공간을 나타내지만, short 의 경우는 -32768 ~ 32767 의 공간을 나타내기때문에 만약 'a'의 데이터가 short 와 char의 겹치지 않는 공간에 있는 데이터라면 데이터 손실이 일어나기 때문에 자동으로 형변환이 되지 않고 에러가 발생하게 된다.


강제로 데이터 형태를 바꿀 수도 있다. casting.
자동으로 데이터가 변환되지 않는 상황에서 데이터를 바꾸고 싶다면!? 분명 그런 경우도 있을 것이다. 그런 경우에는 casting 연산자를 사용하여 강제로 형변환을 하는 것이 가능하다. 하지만, 한가지 주의해야 할 점은 강제로 형변환 되는 데이터에 대한 손실은 개발자의 판단에 맡긴다는 것이다. 이 캐스팅 연산자는 다음과 같이 사용할 수 있다.

int a = 100;
short b = (int)a;

위와 같이 변환하고자하는 목적 데이터형은 본래의 데이터앞에 써주기만 하면 된다. 확실하게 데이터 손실이 이루어지지 않는 형변환이나, 손실을 감수해야 하는 형 변환이라면 유용하게 사용할 수 있는 방법이다.


자료형을 변환하는 똑똑한 방법! Wrapper 클래스.
자바는 모든 기능들이 객체의 형태로 선언되어 있고 사용할 수 있다. 기본으로 사용되는 데이터 형까지 객체의 형태로 표현이 된다면 그 효율성은 극대화 될 것이다. 그러한 의미에서 사용되는 것중 하나가 랩퍼 클래스 이다. 다른 형태의 데이터 형을 변환할때 사용하기도 하지만, 그 데이터를 객체화 시킴으로써 효율적인 관리가 이루어지고, 은닉화를 통한 데이터의 보호기능도 갖게 된다. Wrapper 클래스는 일반적인 자료형의 이름과 같지만, int 와 char 은 조금 더 긴 이름으로 사용된다. (Boolean, Byte, Short, Character, Integer, Long, Float, Double) String 같은 경우는 이미 객체화 되어 있는 상태이기 때문에 Wrapper 클래스가 따로 존재하지 않는다. 랩퍼 클래스를 사용하는 방법은 다음과 같다.

int a = 100;
byte b = Byte.parseByte(a);

위와 같은 형태로 사용할 수 있는데, 각 클래스별로 Integer는 parseInt로 Shrot는 parsdShort와 같은 형식으로 사용될 수 있다. 좀더 자세한 형식이나 메소드에 대해서는 JAVA Document 를 참조하면 알 수 있다.

Posted by seanhigher

댓글을 달아 주세요

최근에 달린 댓글

글 보관함