'Java'에 해당되는 글 7건

  1. 2008.10.24 동적 할당 이야기 - 3 1
  2. 2007.11.10 하고 싶은게 너무 많아 감당을 못할때
  3. 2007.11.02 equals()메소드 2
  4. 2007.11.02 값의 비교와 레퍼런스
  5. 2007.09.25 Thinking in JAVA 3nd Edition 1
  6. 2007.09.07 레퍼런스 변수 1
  7. 2007.09.05 Eclipse 사용후기 3
Study- MSC/Computer2008. 10. 24. 19:48
  이번 포스팅에서는 동적할당을 객체의 생성쪽으로 확장해 보고자 한다. 먼저 말해두지만 이 포스팅은 포인터나 객체, 클래스를 설명하기 위한 포스팅이 아니다. 어디까지나 이런 사항에 대한 기본적인 지식은 알고 있다고 가정하고 진행하겠다. 우선 C++에서 Example이라는 클래스가 있고, 그것에 대한 객체를 생성해 보자.

Example ex;

  자. ex라는 객체가 생성되었다. 아마 특별한 문제 없이 제대로 돌아갈 것이다. 그리고 파괴도 잘 될 것이다. 하지만 이런 방식의 객체 생성은 권하고 싶지 않다. 대신 이런 객체의 생성을 권한다.

Example* pEx = new Example();

  위 방식은  Example라는 클래스 형식으로 메모리 공간에 할당을 한 후 그 주소를 pEx 포인터 변수에 넣어서 사용하게 하는 방식이다. 앞선 포스팅에서, 메모리의 어딘가에(HEAP) 공간을 할당한다고 했는데 위 방식도 바로 이런 방식이다. 이렇게 해 놓으면 이어서 이렇게도 가능하다

Example *pEx = new Example();
pEx = new Example();

  잘 이해가 가지 않을것이다. 무슨 이야기냐면 한 객체를 메모리에 생성하여 한 포인터에 주소를 기억시켰는데, 그 포인터를 재사용하여 또다른 객체를 또 생성하여 그 주소를 넣을 수 있다는 이야기이다. 물론 위 코드는 첫 객체의 해제에서 문제가 발생하지만 이런식으로 좀 더 코드에 유연성을 줄 수 있다. 그렇지 않으면 Example ex1,ex2; 등의 방식으로 객체를 생성해야 하는 문제가 발생한다.
  앞서 말한 유연성 외에도 이런 방식의 동적 할당을 통한 객체 생성은 맨 처음 말한 동적할당의 장점을 최대한 살릴 수가 있게 된다. 객체는 일반 변수보다 여기 저기서 사용될 가능성이 많다. 무슨 말이냐면 지역 변수 이상의 용도로 사용될 가능성이 많다는 이야기이다. 만약에 게임을 만들때 적을 표현하는 클래스가 있고 그 객체를 생성한다고 하면 상황에 따라 계속해서 적을 만들어 내야 하므로 동적 할당이 필요 할 수 밖에 없다.(int형으로 적을 표현할수는 없지 않은가?)
  이제까지는 객체를 동적할당 할 때 포인터를 이용하였다. 그 이유는 C++은 기본적으로 Call by Value 방식이기 때문이기 때문인데 이는 변수 및 객체의 사용을 한정적인 위치에서만 사용할 수 밖에 없게 만든다. 이 틀을 극복하기 위해서 메모리상의 주소로 읽기 위한 포인터가 사용되는데, 여기서 한단계 더 나가서 레퍼런스라는 개념이 나온다. 적어도 여기서는 Call by Reference와 Call by Address의 개념을 다르게 두자. Call by Address는 결론적으로는 포인터의 값을 이용한 Call by Value로 볼 수 있다. 엄밀하게 말하면 Call by Reference와는 다르다.(물론 내부적으로 이놈도 포인터를 쓰긴 쓴다.)
  말이 샜는데, C++ 이후의 객체 지향 언어는 기본 참조 방식을 Call by Value가 아니라 Call by Reference를 채택한 경우가 많다. JAVA가 그렇고, C#이 그러며, 심지어 Visual Basic도 Call by Reference가 기본이다.
  무슨 말이냐면 만약에

Example ex;

라는 코드가 있으면 C++에서는 ex가 객체 그 자체이지만 JAVA나 C#등에서는 저것은 그냥 참조를 위한 레퍼런스에 불과하지 객체 자체는 아니다. 즉 아무것도 못한다. 레퍼런스는 포인터처럼 메모리 상의 어떤 것을 가리켜야 그 의미가 있다. 즉

Example ex = new Example();

  와 같이 객체를 생성하고 그것을 참조하여야 한다.
  말이 많았다. 정작 하고 싶은 말은 '동적할당은 메모리 어딘가에 공간을 할당하고 포인터를 이용하여 그것을 참조한다, 그리고 이는 객체에서도 마찬가지이며 좀더 나아가 레퍼런스는 참조 없이는 아무런 의미가 없다'였는데 이것을 표현하기 위해 쓸데없는 말이 너무 많았던 것 같다.
  아무쪼록 이 글을 읽고 뭔가 '아!'하고 깨달음(?)을 얻는 프로그래머 지망생이 있으면 좋겠다. 그렇게 기원하면서 이상 3회에 걸친 포스팅을 마치고자 한다.
Posted by 머리
나의 이야기/Note2007. 11. 10. 01:01
  지금 내가 공부 하고 있는 언어들을 한번 세어 보면

1. C
2. C++
3. JAVA
4. C#
5. VB.NET
6. Delphi

  여기에 세부 분야까지 넣어 보면
1. API
2. MFC
3. TCP/IP

  뭐 이정도. 문제는 이런 것들을 그냥 배워 보고 싶다는 생각에 건드려만 본다는 것이다. C/C++이야 항상 만지고 있는 거니 예외라 치고, 델파이는 거의 안하니 제외 해도 너무 하려고 하는게 많다. 특히 C#이랑 JAVA는 의욕에 비해 하는게 너무 없는듯하다.

  지금 생각은 이렇다. 한 두가지 정도만 집중할것이냐 조금만 더 힘낼 것이냐. 솔직히 말해서 조금 버겁긴 하지만 그렇다고 못하겠는건 아니다. 그냥 진도가 너무 안나가는 것에 대한 불안감?

  그래도 대학 와서 내가 이쪽 분야 그동안 공부했던것과 비교해 본다면 결코 무리라는 생각은 안든다. 다만 걱정되는건 어린 시절 근 10년간 VB를 파 오면서 너무 공부하기에는 어렸었다는 것도 있었겠지만 여러가지를 많이 해보고 싶어서 이것 저것 해보다가 어중간하게 얕고 넓게(?) 익히게 되어서 그게 반복되지 않을까 신경쓰인다.

  1월 안에는 윈어플 큰거 하나 짜놓고 가긴 가야 하는데.. 제일 승산 있는게 무엇일까? 제일 승산있는건 MFC나 C#쪽인데.. 아무래도 최근에 새로 배우는 언어는 C#이 제일 무난하게 나가고 있어 조금만 더 하면 윈폼 시작할것이니. 아니면 지금 텀 프로젝트한다고 공부중인 MFC도 요즘들어 뭔가 감이 잡혀가기 시작해서 조금만 더 노력하면 속도가 붙을 것 같은데..

  이렇게 해봐야 겠다. JAVA로는 뭐 만드는건 잠시 미루되 꾸준히 공부는 하고 MFC는 텀에 충실하되 실력이 늘 수 있게, 그리고 C#으로는 뭘 만들도록 주로 공부해 봐야지. 이렇게 실천할수 있으면 얼마나 좋아.
Posted by 머리
Study - Programming/JAVA2007. 11. 2. 02:09

앞선 포스팅에서 equals()메소드를 이용하면 값의 비교가 가능하다고 하였다.

하지만 다음 코드의 결과값은 역시 false이다.

class Value
{
 int i;
}

public class EqualMethod{
 public static void main(String[] args)
 {
  Value v1 = new Value();
  Value v2 = new Value();
 
  v1.i = v2.i = 100;
 
  System.out.println(v1.equals(v2));
 }
}

그 이유는 Default equals method 는 객체의 레퍼런스를 비교하기 때문에 false가 되는 것이다.
그러므로 Default equals method가 아닌 따로 equals() 메소드를 오버라이드 시켜 줘야 한다. 예를 들면 이렇게.

 boolean equals(Value obj)
 {
  if(obj.i == i)
   return true;
  return false;
 }

Posted by 머리
Study - Programming/JAVA2007. 11. 2. 01:42

  자바를 공부하면서 항상 느끼는 것인데.. 정말 자바는 객체로 시작해서 객체로 끝난다.. 이렇게 객체만 사용하다 보면 객체에 대한 감을 못잡을 리가 없다.

  다음 코드를 보자.

public class Equivalence {
 public static void main(String[] args)
 {
  Integer n1 = new Integer(10);
  Integer n2 = new Integer(10);
  System.out.println(n1==n2);
 }
}
  이 코드의 결과값은 무엇일까? 언뜻 보면 true일 것 같지만 답은 false이다. 왜 그럴까? 조금만 생각해보면 알 것이다. 위에서의 비교문은 n1이 가리키고 있는 객체와 n2가 가리키고 있는 객체가 같은 객체인가를 묻는 것이다. 그러니 당연히 false가 나올 수밖에.

  그렇다면 n1과 n2의 값을 비교하려면 어떻게 해야 할까? 답은 equals()메소드에 있다. n1==n2를 다음과 같이 고치면 true가 나올 수 있다.

n1.equals(n2)

  의미는 금방 파악이 갈 것이다. 값의 비교를 해 주는 메서드이다.

Posted by 머리
Study - Programming/JAVA2007. 9. 25. 23:33
Tinking in JAVA 3nd Edition(by Bruce Eckel) 원서 PDF 파일이다. 저자가 공개해 놓은 책 인듯 하다.
딱히 자바 책을 구해 놓은게 없어서 이걸로 공부해 봐야겠다. 얼마나 갈 지는 모르겠지만.

아 요새 너무 하고 있는게 많다. 학과 공부, C++/ C# / JAVA.. 내가 너무 욕심을 내고 있는 건가?
Posted by 머리
Study - Programming/JAVA2007. 9. 7. 21:45
다음 코드가 있다.

int a;
a = 3;

  이렇게 하면 a의 값은 무엇일까? 당연히 1이다. 하지만 Test라는 클래스가 있고 이런 코드가 있다면 어떨까?

Test ex;

  ex는 아무것도 가리키고 있지 않다. Test형으로 변수를 만들었을 뿐이지만 이것은 아무 의미없는 객체라는 것이다. 단지 Test라는 형태의 틀만 가지고 있을뿐. 이럴 때 Test클래스 안에 Show라는 메소드가 있다고 치고, 다음과 같이 실행하면 에러가 발생한다.

ex.Show(); //에러

왜냐하면 ex는 아무것도 가리키고 있지 않기 때문이다. 이럴 떄는 새로운 인스턴스를 생성해 주어서 이 인스턴스를 가리키게 해 주어야 한다.

Test ex = new Test();

  잠깐 메모리 구조를 확인해보자.
  앞에서 int형 변수 a의 값은 바로 3이다. 그러나, ex의 값은 다르다. 메모리상으로 Test라는 클래스의 인스턴스가 하나 새로 생성되었고, ex는 이 인스턴스의 메모리 주소를 가리키고 있다. 즉 ex의 값은 인스턴스 자체는 아니라는 이야기다.

  ex와 같은 변수를 레퍼런스 변수라고 한다. C++의 레퍼런스와 상당히 비슷한 개념이다. 그렇다고 포인터는 아니다. 포인터는 주소에 직접 접근해서 그 값을 바꿀 수 있지만, 레퍼런스는 오로지 레퍼런스 변수를 통해서 그 안의 메소드와 멤버 변수만 사용할 수 있다.

  알아두자.일반 데이터형은 바로 그 값을 가리키지만 레퍼런스 변수는 그렇지 않다.
Posted by 머리
Study - Programming/JAVA2007. 9. 5. 01:22

  JAVA SDK 설치하고 나서 메모장으로 대충 코딩하면서 살아 보자고 하려 했더만 도저히 답답해서 안되겠더라. 특히 들여쓰기! 진짜 이건 너무하다 싶었다.
  그래서 울트라 에디트나 에디트 플러스 같은거 깔아 볼까 생각도 해봤지만 결론은 IDE를 깔자,그래서 뭐 별거 있나? 이클립스를 깔았다.
  맨 처음에는 이클립스를 설치하면 JAVA SDK를 자동으로 깔아 줄 줄 알았는데 아니더군.. 포맷한 직후라 깔려 있지도 않았는데.. 귀찮아하며 JAVA SDk 깔고,이클립스를 깔았다.
  확실히 내가 MS 관련 개발 툴에 많이 잡혀 있나 보긴 보다. MS 툴이 아니면 다른 툴은 사용하기가 낯설다. 아까 델파이도 그랬고, 지금 이클립스도 그랬다.
  뭐 대충 코딩 간단히 하고 컴파일을 해 보았다.

사용자 삽입 이미지


  이게 코딩하고 컴파일한 화면. 개발 환경은 놀랄만큼 잘 되어 있다. 프로젝트를 생성하면 자동으로 메인 클래스 하나를 만들어 준다. 여기서 메인 함수를 적어 주면 된다.
  코딩 환경도 매우 맘에 들더라. 우선 당연히 들여쓰기는 지원해주고, 함수의 괄호들도 알아서 닫아 준다.
  또 마음에 드는건 오른쪽에 아웃라인. VC++의 클래스 뷰어와 비슷한 기능을 하더라. 마음에 너무 든다. 그리고 콘솔 화면도 따로 명령 프롬프트 창을 보여주는게 아니라 아래쪽에 콘솔 탭이 하나 있다. 이것도 좋은 기능이라고 생각한다.
  이렇게 강력한데 어찌 오픈소스를 무시하겠는가. 이클립스, 반했다 너한테, 덕분에 자바공부 안하고 있었는데 하고 싶어 졌잖아!!
Posted by 머리