오늘은 캐스팅의 관해서 포스팅 한다. (형변환이라 부르기도 한다.)


캐스팅은 OOP(객체지향프로그래밍) 에서 매우 중요하다.


왜냐하면 캐스팅은 OOP의 다형성과 관련이 있기 때문이다.


자바를 통해서 설명하겠다. (어떤 언어든 상관없다.)


자바에서의 데이터형은 아래와 같이 크게 2가지로 나눌 수 있다. 


데이터형 : 기본형 , 참조형.


자바에서 기본형은 8가지다. ( boolean, int, short, byte,double, long, float, char ) 이다.


자바에서 참조형은 만들기 나름이지만, 예시를 들자면, 많이쓰는 String 정도가 되겠다.


캐스팅의 목적은 데이터를 바꾸는 것이 주목적이 아닌, 


코드를 적는 프로그래머가 이미 데이터 정보에 대해 이해한 가정하에, OOP의 다형성 측면에서 사용한다.


기본 데이터형에서의 캐스팅은 원칙적으로 데이터손실을 막고자 한다.


아래의 예시를 보자.


int a = 1.0; 


위의 예시는 컴파일 에러가 뜬다.


변수는 분명 int 정보만 원하고 있다. 1.0이라는 실제데이터는 int 정보를 이미 가지고 있고, 소수점을 표현하는


double형 데이터이다. 변수라는 것은 원하는 정보가 실제데이터에 있을 시, 문제 없이 받아 올 수 있다.


하지만 위의 예시는 왜 컴파일 에러가 뜰까?


답은 실제 데이터 1.0이라는 것이 a 변수에 들어 가면 1로 바뀌기 때문에 실제 데이터가 손실되는것을 막고자 하는 것이다.


하지만, 코드를 작성하는 프로그래머가 데이터가 손실된 다는 것을 이미 알고 있고 OOP의 다형성을 이용하고 싶을때는


아래와 같이 캐스팅을 하는 것이다. 


int a = (int)1.0;


실제데이터 앞에 (데이터 자료형) 을 붙여주면 캐스팅이 된다. 따라서 a 에는 1.0 대신 캐스팅된 1이 들어간다.


반대의 상황은 어떨까? 아래의 상황을 보자.


double b = 1;


위의 상황은 컴파일 에러가 뜨지 않는다. 하지만 의문을 가져야 한다.


분명 변수가 원하는정보는 더블형 데이터 자료형 이지만, 실제 데이터는 1이라는 int 자료형만 넣었다.


원칙으로는 변수가 원하는 정보를 충족하지 않을 시, 컴파일 에러가 떠야 한다.


하지만 컴파일 에러가 뜨지 않는 이유가 무엇일까?


그 이유는 기본형 끼리의 캐스팅이기 때문이다. 분명 실제 데이터는 1밖에 넣질 않았지만,


기본 자료형은 이미 컴파일러가 알고 있는 자료형이다. 따라서, 더블형 데이터의 형태를 추측으로 알 수 있는 것이다.


즉, 컴파일러가 자동적으로 더블형으로 바꿔주는 것이지, 원칙으론 안된다는 것을 알아야 한다.







실제로, 다음 포스팅할 다운캐스팅 같은 경우는 참조형 끼리의 형변환 이므로, 컴파일러는 참조형 데이터를 추리하지 못한다.


따라서, 윗 개념과 일맥상통하게 기본적으로 다운캐스팅은 성립되지 않는 개념이다. 


다음 포스팅때 업캐스팅과 다운캐스팅에 대해 그 의문을 풀어볼 것이다.



http://mommoo.tistory.com/41 - 업캐스팅

http://mommoo.tistory.com/51 - 다운캐스팅 



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

프로그래밍을 하다보면 데이터 자료구조를


변환해야 할 때가 있다. 오늘 포스팅은


ArrayList or List <-> 배열(Array)로 변환하는걸 


다루어본다.



중요한건 자료구조를 바꾸는 것이지 자료형은 일치해야 한다는것이다.


아래의 예시는 가장 많이 쓰이는 String 클래스 자료형을 이용한 변환 예제이다.



1. List -> Array(배열)


ex ) for문.


ArrayList<String> arrayList = new ArrayList<>();


arrayList.add("Test1");

arrayList.add("Test2");

arrayList.add("Test3");


String[] array = new String[arrayList.size()];

int size=0;

for(String temp : arrayList){

  array[size++] = temp;

}




윗 for문 방식은 arrayList (리스트) 데이터를 for문을 통해 순서데로 String 배열에 넣는다.


아래의 방식은 List에서 제공하는 메서드를 이용한 방식이다.



ex ) List에서 제공하는 메서드 사용.



ArrayList<String> arrayList = new ArrayList<>();


arrayList.add("Test1");

arrayList.add("Test2");

arrayList.add("Test3");


String[] array = arrayList.toArray(new String[arrayList.size()]);




2. Array(배열) -> List


ex ) for문



String[] array = new String[3];


array[0] = "Test1";

array[1] = "Test2";

array[2] = "Test3";


ArrayList<String> arrayList = new ArrayList<>();

for(String temp : array){

  arrayList.add(temp);

}




1번의 for문 예시와 같은 원리이다. 아래의 방식은 Arrays에서 제공하는 메서드를 이용한다.

.

ex )Arrays 메서드 사용,


String[] array = new String[3];


array[0] = "Test1";

array[1] = "Test2";

array[2] = "Test3";


ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(array));




예시는 String으로 했지만, 모든 자료형이 가능하다. 중요한건 바꿀 자료구조끼리 자로형이 같아야한다.


원리는 for문이나 변환을 위해 제공되는 메서드나 똑같다.


하지만, 제공되는 메서드를 사용할시 코드를 간편하게 작성할 수 있는 장점이 있고, 더군다나


JAVA8 에서는 좀더 간단하게 표현 할 수 도 있다.



따라서, 알아두면 유용하게 쓰일 것이다.



'Java' 카테고리의 다른 글

JAVA - UpCasting(업캐스팅)  (9) 2016.06.07
JAVA - Casting(캐스팅)  (0) 2016.05.26
JAVA BufferedReader readLine에 관하여.  (2) 2016.04.09
Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

소켓프로그래밍을 하거나 파일입출력을 할때


자바가 제공하는 스트림을 사용한다.


(InputStream , OutputStream)


하지만 Byre 단위라서 영어나 숫자등은 잘 출력되는데,


단위가 2바이트인 한글은 깨져서 출력된다.


그래서 char 단위인 InputStreamReader를 쓴다.


해당 클래스를 쓰면 한글도 잘 출력되지만, 한글자씩 받아와야 하는


상황이 아니면 버퍼에 저장하여 한꺼번에 받는 방식을 많이 사용한다.


아래와 같이 코딩한다.


InputStream is = // inputStream 초기화는 상황마다 틀리므로, 초기화됬다 가정한다.


String temp;


BufferedReader buffer = new BufferReader(new InputStreamReader(is,"UTF-8");


while((temp = buffer.readLine() ) != null){


//........


}



윗 코딩 처럼 사용할때, 주의 할점이 readLine()은 개행문자가 포함되어야 내부 blocking이 풀리면서 wihle문이 실행한다는 것이다.


다시 말하자면,


BufferReader의 readLine() 를 쓸때는 inputStream 이 반드시 개행문자가 포함되어야 한다. 자바에서의 개행문자는 "\n" 이지만,


스트림에서의 개행문자는 "\r\n"이 개행문자이다. 


따라서, 보내는쪽의 데이터 뒤에 "\r\n"을 반드시 붙여야한다.


ex ) 


String tempData = "아야어여오유";


Byte[] bytes = (tempData+"\r\n").getBytes();




'Java' 카테고리의 다른 글

JAVA - Casting(캐스팅)  (0) 2016.05.26
JAVA - ArrayList에서 배열로, 배열에서 ArrayList로  (2) 2016.04.25
Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅 할 내용은 자바의 foreach문(향샹된 for문으로 부르기도 한다.)에 대해 알아볼 것이다.


보통 for문을 사용할땐 아래와 같이 사용한다.


for(int i=0; i<array.size(); i++){

System.out.println(array.get(i));

}


위와 같이 for문은 초기값 ; 조건식 ; 증감식 을 통해서 사용한다.


보통 조건식을 array.size()를 사용함으로써, array의 크기가 바뀌더라도 알아서 적용하게끔 쓴다.


하지만, 조건식에 array.size()를 사용할 시, for문이 돌때마다 size를 호출 한다는 단점이 있다.


데이터가 적을땐 문제가 안되지만, 만약 데이터가 많다고 가정해보면 문제가 될 수 도 있다.


따라서 아래와 같이 사용하기도 한다.


for(int i=0,size = array.size(); i<size; i++){

System.out.println(array.get(i));

}


초기값 세팅에 size를 미리 구해서 for문이 돌때마다 array.size() 메서드의 사용을 피한 것이다.


위의 예시에선 문제가 없지만, 아래와 같은 경우에 또 문제가 생길 수 있다.


for(int i=0,size = array.size(); i<size; i++){

System.out.println(array.get(i));

System.out.println(array.get(i));

}


무엇이 문제가 될 수 있을까? 답은 array.get(i)를 두번 호출 해야하는 상황에서 생길 수 있다.


단순히 원하는건 array.get(i)가 리턴해주는 String 값인데, arrayList를 쓸때없이 두번 접근 하고 있다.


이러한 문제를 해결하기 위해선 보통 아래와 같이 코딩한다.


for(int i=0,size = array.size(); i<size; i++){

String tempValue = array.get(i);

System.out.println(tempValue);

System.out.println(tempValue);

}


위의 예제에서는 String 변수 tempValue에 array.get(i) 값을 미리 저장시켜


array호출을 두번 하지 않고 String Value만을 프린트하게 한다.  이렇게 함으로써 array를 한번만 접근할 수 있다.


지금까지 for문 사용법에 변천사를 쭉 보아왔는데, 이러한 것들을 foreach문 쓰면 편하다.


for(String tempValue : array){

System.out.println(tempValue);

System.out.println(tempValue);

} 


간단하지 않은가! 이렇게만 작성해주면 위에서 말했던 문제점들이 전부 해결된다.


특이한점은 초기값 세팅에 size를 미리 구할때도 size()메서드를 한번은 호출한다.


하지만 foreach문은 size()메서드를 한번도 안부른다는 점이다.


(주관적인 생각은 array를 하나씩 get 하면서 끝까지 index가 끝까지 도달했을때,


끝나게끔 코딩을 한것이 아닌가 생각이든다.)


하지만 위의 예제에서 혹시 index값을 구하고 싶은경우가 있을것이다.


그런경우는 아래와 같이 코딩하면 될것이다.


int index = 0;

for(String tempValue : array){

System.out.println("Index : " + index++);

System.out.println(tempValue);

System.out.println(tempValue);

} 


foreach문은 JDK 5.0 이상부터 지원하는 문법이다.


만약 일반 for문이랑 차이점을 모른다면 잘 안쓸 문법이다.


하지만 위에서 설명한 이유를 읽어보고 잘 이해를 했다면


충분히 써 볼 가치가 있다고 느낄 것이다.






'Java' 카테고리의 다른 글

JAVA - ArrayList에서 배열로, 배열에서 ArrayList로  (2) 2016.04.25
JAVA BufferedReader readLine에 관하여.  (2) 2016.04.09
JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅 할 내용은 Static에 대해 알아 볼 것이다.


프로그래밍 용어로써의 Static은 정적의,고정의 뜻으로 생각하면 된다.


자바에서는 어떻게 쓰이나 아래의 설명을 보자.


먼저, 자바는 Statically Type Variable (정적 타입 변수)를 가진다.


예를 들어, 변수를 사용할때 아래와 같이 사용한다.


int a = 1;


int라는 자료형을 미리 정해줌으로써 a 변수는 정수 실제 데이터 밖에 싣지 못한다.


미리 자료형을 고정하므로 Static개념이다.


많은 스크립트 언어가 윗 개념과의 반대인 Dynamically Type Variable(동적 타입 변수)를 가진다.


예를 들어, 자바스크립트에서는 아래와 같이 변수를 사용한다.


var a = 1;


여기서는 var(Variable의 약자) 이라는 변수 표시와 함께 변수명 a를 선언 했을때, 실제데이터의 종류에 따라 동적으로


타입이 결정된다. 윗 예시는 실제데이터가 정수형 이므로 a의 자료형은 정수형이 되는것이다. 



두번째로, 자바는 static 예약어를 제공한다. 윗 개념에서 살펴 보았드시, Static은 정적의 고정의 뜻으로 생각하면 된다. 아래의 예시를 보자.


public class StaticTest{


 static public int a = 1;


 public int b = 3;


 static public void add(){

 }

}


윗 예시는 int 형 변수 a 를 static 예악어를 통해 고정시켜 놓았다. 어딜 고정 시켜 놓은 것 일까?


답은 메모리에 미리 고정시켜 놓은것이다.


클래스 안의 변수를 사용하기 위해서는 인스턴스를 생성해야 한다. 

ex)

 StaticTest st = new StaticTest(); 

 st.a;

 st.add; 

<인스턴스 변수. 변수 or 메서드>


하지만, static 예약어를 사용하면 인스턴스를 생성하기 전에 미리 메모리에 올려놔 고정시킨다.


이렇게 되면 무슨 특징이 있을까? 아래와 같은 특징이 있다.




1. 인스턴스를 생성한 후 이용가능 하던 변수가 static 예약어를 사용함으로써, 미리 메모리에 올라가 있으므로, 인스턴스 생성 없이 바로 사용가능하다.


  StaticTest.a; 

  StaticTest.add();  

<클래스.변수 or 메서드>


2. StaticTest 의 인스턴스를 몇개를 생성하든 a의 변수는 이미 메모리에 올라가 있으므로,

  

  인스턴스 마다 변수 a가 생기는 것이 아니라 메모리에 미리 올라가 있던 변수 a를 공유한다. 


  따라서 static 예약어를 사용한 변수는 공유변수 라고도 불린다.


  변수a를 공유하므로 변수a크기 만큼 메모리를 아낄 수 도 있다. 


  메서드도 똑같이 생각하면 된다.


3. 만약 변수b를 static 메서드 add안에다가 사용하면 오류가 발생한다. 

  

  이유는 int b는 StaticTest의 인스턴스가 생성되어야 쓸수 있는 멤버변수지만,

  

  static public void add()는 인스턴스가 생기길 기다려주지 않고 바로 메모리에 올라가기 때문에 


  StaticTest안에 일반 멤버변수 b는 쓰지 못한다.



여기까지가 준비한 포스팅 내용이다. 프로그래밍 개념으로서의 static은 고정하다, 정적이다. 라는 뜻이므로


자바 뿐만 아니라 static 개념이 나오는 모든 프로그래밍을 윗 개념으로 이해하면 좋을 것 이다.





'Java' 카테고리의 다른 글

JAVA BufferedReader readLine에 관하여.  (2) 2016.04.09
Java foreach문(향상된 for문)  (0) 2016.03.30
자바 enum 열거형  (0) 2016.01.27
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20
JAVA의 삼항연산자  (4) 2015.12.11

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅 할 내용은 자바의 enum 예약어 이다.


자바에는 크게 2개의 데이터 타입이 존재한다. 기본형과 참조형.


enum은 두개의 데이터 타입중 참조형이다.


enum은 참조형이지만, int 형 같은 기본 자료형 처리와 같은 성능을 발휘한다.


따라서 내부 처리속도가 빠를뿐더러, 코드 가독성을 높이고 의미를 부여할 수 있는 장점이 있다.


간단한 enum예시는 아래와 같이 쓴다.


public enum Units {Marine,SCV,Zergling};
Units unit = Units.Marine; // 마린을 선택할경우.
switch(unit){
  case Marine:
  break;
  case SCV :
  break;
  case Zergling :
  break;
}


예제와 같은 분기 로직을 처리 할때 사용자 입장에서 코드 가독성과 의미가 부여됬음을 쉽게 알 수 있다.


Enum에 대해 좀 더, 자세한 사항을 알고 싶다면 아래의 포스팅을 읽기를 권한다.




자바 Enum 자료형 1편 - http://mommoo.tistory.com/57



'Java' 카테고리의 다른 글

Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20
JAVA의 삼항연산자  (4) 2015.12.11
JAVA의 생성자 (2)  (2) 2015.11.17

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘은 자바의 익명클래스(Anonymous Class) 혹 무명클래스 에 관해 포스팅을 할 것이다.


익명클래스는 말 그대로 익명의 성질을 가진 클래스라는 뜻이다. 즉 이름이 없는 클래스라고 불리우는데,


'이름이 없는' 이란 의미를 잘 생각해봐야 한다. 아래의 예시를 보자.


public class Test{
    private int num = 1;
    public int getNum(){
        return this.num;
    }
    public void setNum(int num){
        this.num = num;
    }
}

Test란 클래스이다. 멤버변수 num 을 private로 접근을 제어한 후,


게터와 세터로 멤버변수를 접근할 수 있도록 만들었다.



    Test t1 = new Test();

평상시 처럼 인스턴스를 사용할땐 위와 같이 사용한다. 


여기서의 인스턴스 (new Test())는 클래스 이름 'Test'라고 불리운다.


즉 우리가 노말하게 쓰는 인스턴스는 '이름이 있는 클래스' 인것이다.


그렇다면 '이름이 없는 클래스'는 무엇을 의미하는 것 일까? 


위에서 설명한 이름이 있는 클래스의 반대 경우이다. 


즉 Test와 같은 클래스이름 자체가 없는 클래스를 의미한다. 아래의 예시를 보자.


     Test t1 = new Test(){
         public int num = 10;
         @Override
         public int getNum(){
             return this.num;
         }
     };                

바로 위의 소스코드랑은 비슷하면서도 다른점이 있다. 다른점은 인스턴스 옆에 블럭이 있다는 점이겠다.


언뜻 보면 new Test()라는 소스코드 때문에 이 인스턴스는 Test의 이름을 가질 것 같지만,


결코 아니다. 이 인스턴스야 말로 정말 어떠한 이름도 없는 인스턴스 인 것이다.


해당 주장이 맞는 주장인지 근거를 제시해보겠다.


먼저, 해당 인스턴스의 블럭안에는 @Override 어노테이션 주석이 존재한다. 즉, 원래의 Test 클래스에


존재하던 getNum 메서드가 아닌 재정의된 메서드 인점,


또한, 이 인스턴스의 this.num을 출력했을 경우 10이 나온다는 점이다. 


오히려 이 인스턴스는 Test 클래스를 상속받은 클래스라고 바꿔 말해도 될 것이다. 


평소에 자바언어를 사용하는 사용자라면, 상속을 어떻게 쓰는지 알 것이다.


클래스명 extends 상속받을 클래스     구조로 사용하는데 위의 소스 코드는 클래스명이 존재 하지 않고


무명의 어떠한 클래스가 부모클래스로 부터(Test) 상속을 받은 인스턴스 인 것이다.


즉 이름이 없으므로 생성자를 선언 할 수도 없는것이다.


왜 이름이 없는 클래스라고 불리우는지 감이 잡히는가?



익명클래스에 대해 간단하게 알아보았다. 현재 함수형 프로그래밍이 유행하고 있다.


자바에서는 함수를 일급객체로 취급하지 못하지만, 위에서와 같이 익명클래스를 사용하면


메서드 자체는 못넘기되 메서드를 감싼 익명클래스를 넘길 수 는 있다. 


즉, 익명클래스로 자바도 함수형 프로그래밍 흉내를 낼 수 있다고 생각한다.



'Java' 카테고리의 다른 글

JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27
JAVA의 삼항연산자  (4) 2015.12.11
JAVA의 생성자 (2)  (2) 2015.11.17
JAVA의 생성자 (1)  (0) 2015.11.12

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee



제목은 자바의 삼항연산자라고 적었지만.


이 삼항연산자는 언어 불문하고 자주 쓰이는 코드다.


삼항연산자를 쓰는 이유는 딱 하나이다. 어렵지 않은 알고리즘의 다수줄의 코드를


가독성 좋게 한 두줄로 바꿔줄 수 있기 때문이다.


아래의 예시를 보자.



if(a>b){
		result = 111;
	}else{
		result = 222;
	}


어렵지 않은 코드이다. a가 클시 result에는 111이 들어가고 b가 클시, result에는 222가 들어간다.


문제가 뭐냐면... 귀찮다 분명 어렵지 않은 알고리즘이지만, 


다른 코드들이랑 쓰다보면 눈에 안들어 올 것이다.


위코드를 아래와 같이 바꿀 수 있다.



result = (a>b)?111:222;


이런식으로 쓴다. result의 값은 위 위의 코드와 동일하게 들어간다. 


변수 = (참이나 거짓이나오는 부울린) ? (참일경우 들어가는 값 ) : (거짓일 경우 들어가는 값);


위의 경우는 int형 변수 result를 썻지만. 좀더 응용하면 여러 변수들을 상황에 맞게 쓸 수 있다.


예를들어, 자바의 JFrame 에서 visible을 컨트롤 한다고 생각해보자.



frame.setVisble((frame.isVisible())?false:true);



이해가 가는가? 삼항연산자의 리턴값을 변수에 넣지 않고 바로 setVisible안에 넣은것이다.


따라서 저 코드는 visible 이 트루 일때는 frame을 안보이게하고. 


visible이 거짓 일때는 frame 을 다시보이게 하는 코드라 할 수 있겠다.




 

 

'Java' 카테고리의 다른 글

JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20
JAVA의 생성자 (2)  (2) 2015.11.17
JAVA의 생성자 (1)  (0) 2015.11.12

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts