'My work space/Java'에 해당되는 글 78건

  1. 2008.08.14 [아시나요?]main()메소드에 관하여
  2. 2008.08.14 [아시나요?]API 문서의 구조
  3. 2008.08.14 [아시나요?]변수의 초기화
  4. 2008.08.14 [아시나요?]자바가 메소드를 찾는 방법
  5. 2008.08.14 [아시나요?]객체
  6. 2008.08.14 [아시나요?]객체 지향 언어_2
  7. 2008.08.14 [아시나요?]객체 지향 언어1
  8. 2008.08.14 [아시나요?]배열
  9. 2008.08.14 [아시나요?]조건연산 , 비트연산 , 시프트연산
  10. 2008.08.14 [아시나요?]이스케이프 문자
2008. 8. 14. 17:40

[아시나요?]main()메소드에 관하여

지금까지 아무 생각 없이 사용하고 있는 main()메소드에 대하여 알아보자


     public static void main(String [] arg)


자바에 존재하는 모든 메소드나 변수는 모두 클래스 또는 객체와 함께 사용해야만 한다. sin()메소드의 경우 Math.sin()과 같이 클래스와 함께 사용하는 것은 가능하지만 sin()메소드만 독립적으로 호출할 수는 없다. 그런데 여기에는 하나의 예외가 존재하는데 바로 main() 메소드이다. main() 메소드는 어떤 클래스나 객체와 함께 사용되는 것이 아니라 자바 가상머신에 의해서 단독으로 호출되는 유일한 메소드이다. 이 말의 의미를 잘 생각해 보면 main() 메소드가 가상머신 , 즉 외부의 어떤 곳으로 부터 호출을 당한다는 사실을 알 수 있다. 즉 외부에서 main() 메소드를 호출할 수 있어야 하기 때문에 main() 메소드는 public 으로 선언하는 것이다.


자바 가상머신에서 main() 메소드를 호출하기 위해서는 main() 메소드가 메모리에 상주하고 있어야만 한다. 그리고 다른 어떤 객체보다도 먼저 실행되어야 하기 때문에 main() 메소드를 static 으로 선언하는 것이다.


main() 메소드는 결과값을 리턴하지 않기 때문에 리턴형을 void로 선언한다.


마지막으로 main() 메소드의 인자로 사용하는 String [] args는 자바 프로그램을 실행할 때 입력되는 문자열을 포함하고 있다. 더 자세히 말하면 클래스명 다음에 입력하는 데이터를 문자열로 저장하고 있는 것이다. 다음과 같이 프로그램을 실행시켰다면 args[0] = test1, args[1] = test2, args[2] = finaltest문자열이 포함된다.


C:\>java CommandLine test1 test2 finaltest


##Command.java##


public class CommandLine {

       public static void main(String [] args) {

                 /* 배열 args의 내용을 출력 */

                 for(int i=0 ; i< args.length ; i ++) {

                           System.out.println("args[" + i + "] = " + args[i] );

                 }

        }

}//end class CommandLine


##실행결과##

args[0] = test1

args[1] = test2

args[2] = finaltest



명령어 라인의 입력이 배열 args 에 순서대호 포함되어 있는 것을 확인할 수 있다. 그리고 args는 변수명이기 때문에 언제나 변경이 가능하다.

2008. 8. 14. 17:39

[아시나요?]API 문서의 구조

혹시 자바의 API문서를 본 적이 있는가?  대부분이 JDK를 설치 할 때 한번 본 것이 전부라고 생각되는데, 이제부터는 이 문서를 좀더 자주 사용하기 바란다. API 문서는 설치 디렉토리 \api\index.html 파일을 실행시킴으로써 살펴볼 수 있다.



API 문서는 크게 세 부분으로 나뉘어 있다. 1번(왼쪽 위쪽)에는 자바의 모든 패키지 목록이 나와 있고, 2번(왼쪽 아래쪽)은 1번에서 선택한 패키지의 클래스가 나열되어 있다. 3번(오른쪽 큰 부분)은 선택한 클래스에 대한 설명과 함께 클래스의 상속관계, 생성자와 메소드에 대한 자세한 설명을 볼 수 있다.


2008. 8. 14. 17:38

[아시나요?]변수의 초기화

하나의 프로그램을 만들기 위해서는 많은 수의 변수를 사용하게 된다. 또한 이들 변수는 사용되는 위치에 따라 필드(멤버 변수)와 지역변수라는 이름으로 구분된다. 변수는 프로그램에서 사용하게 될 데이터를 저장하고 있으므로 언제나 유효한 값만을 가지고 있어야 한다. 만일 변수가 유효하지 않은 데이터를 가지고 있다면 프로그램은 잘못된 연산을 수행하게 된다. 이런 결과를 최대한 줄이기 위해서 자바에서 사용하는 모든 변수는 사용하기 전에 반드시 초기값을 설정해 주어야 한다.


/* 변수를 사용하기 전에 반드시 초기값을 설정해야 한다.*/

private int i = 0;

private String name = "honggildong"

private double d;

d = 43.2;


그런데 다음과 같이 초기값을 설정하지 않아도 프로그램에서 변수를 사용할 수 있는 경우가 있다.


public class Init{

       private int iVar;                           //초기값 설정하지 않음

       private String sVar;                      //초기값 설정하지 않음


       public voids printVar(){

                System.out.println(iVar);        //사용가능

                System.out.println(sVar);       //사용가능

       }

}


앞과 같이 변수에 대한 초기화를 수행하지 않고도 printVar()메소드에서 사용이 가능한 것은 필드가 명시적으로 초기화 하지 않았을 때 자동으로 초기화가 되기 때문이다. 앞에서 초기화를 수행하지 않은 변수 iVar는 0으로 sVar는 null로 초기화가 이루어지게 된다. null은 앞에서도 잠시 언급했지만 객체에 사용하게 되면 아무런 객체도 참조하지 않는다는 의미이다. 다음 표에 변수의 타입별로 자동으로 초기화되는 값을 정리해 놓았다.


String을 포함한 자바의 모든 객체는 null로 초기화 된다. 다시 한번 말하지만 이렇게 자동으로 초기화되는 변수는 필드일 경우에만 해당되는 것이다. 지역 변수는 자동으로 초기화되지 않기 때문에 사용하기 전에 반드시 면시적인 변수의 초기화 작업을 수행해야만 한다.  



자동으로 초기호되는 변수의 값

 데이터 형  값
 byte  0
 short  0
 int  0
 long  0
 float  0.0
 double  0.0
 boolean  false
 char  NUL(아무 값도 갖지 않는다)
 String  null
 모든 객체  null

2008. 8. 14. 16:38

[아시나요?]자바가 메소드를 찾는 방법

자바에서 메소드는 같은 이름을 사용하는 다양한 메소드가 존재할 수 있고. 여러단계의 상속 계층 속에서 오버라이딩될 수 있다. 이렇게 다양한 메소드 중에서 자바는 과연 어쩧게 원하는 메소드를 찾아내서 호출하는 것일까? 여기서 잠시 그 방법에 대해서 알아보도록 하자.


제일 먼저 자바는 지금현대 클래스에서 호출한 메소드의 이름과 인자가 일치하는 메소드를 찾는다. 만일 여기서 일치하는 메소드를 찾았다명 이 메소드를 호출하고 더 이상의 작업은 하지 않는다.


만일 현재 클래스에서 찾을 수 없다면, 이제부터는 상위 클래스에서 검색하게 되는데 이 작업은 일치하는 메소드를 찾을 때까지 계속된다. 만일 최상위 클래스까지 일치하는 메소드를 찾을 수 없다면 자바는 에러를 발생한다.


이렇게 자바는 객체의 위치(상속관계의 위치)에 따라 어느 메소드를 호출할지를 결정하는데 이를 보통 다형성(polymorphism)이라고 한다. 이러한 다형성을 가능케 하는 요인으로는 지연 바인딩(late binding)을 들 수 있는데, 이것은 컴파일 시간에 메소드호출에 관한코드를 생성시키는 것이 아니라 프로그램 실행시에 메소드를 검색하여 원하는 메소드를 호출하는 방식을 말한다. 이는 일반적인 함수 호출 방식인 정적 바인딩(static binding)과 종종 비교되곤 한다. 정적 바인딩은 컴파일 시간에 함수 호출과 관련된 모든 작업이 정해지게 된다.

'My work space > Java' 카테고리의 다른 글

[아시나요?]API 문서의 구조  (0) 2008.08.14
[아시나요?]변수의 초기화  (0) 2008.08.14
[아시나요?]객체  (0) 2008.08.14
[아시나요?]객체 지향 언어_2  (0) 2008.08.14
[아시나요?]객체 지향 언어1  (0) 2008.08.14
2008. 8. 14. 16:37

[아시나요?]객체

객체 지향 프로그래밍에서 말하는 객체란 과연 무엇일까? 객체 지행 프로그래밍이란 말그대로 프로그래밍의 모든 것이 객체를 이용하는 방향으로 진행된다는 뜻이다. 즉 객체 지향에서 모든것은 객체(Object)롤 이루어져 있다. 그런데 바로 전에 객체 지향 프로그래밍은 클래스를 중심으로 프로그래밍을 진행한다고 말한 적이 있다. 조금 헷갈릴 수도 있겠지만 모두 맞는 말이다. 객체 지향 프로그래밍은 객체를 중심으로 움직인다고 할 수도 잇고 클래스를 중심으로 움직인다고도 말할 수 있다. 이 둘 사이의 관계만 잘 정립해도 자바를 배우는데 많은 도움이 된다.


우리가 살고 있는 세상을 한번 들여다보자. 필자는 지금 지구라는 행성에서 아시아라고 하는 대륙에 대한민국이라는 나라에 살고 있다. 필자가 지금 글을 쓰고 있는 곳은 대한민국의 수도 서울이다. 필자의 방에는 컴퓨터와 시계, 어지럽게 널려져 있는 자바에 관한 책과 옷가지들로 가득차 있다. 이처럼 우리가 사는 세상은 모든 것이 표현가능한 어떤 물체로 이루어져 잇다. 지금 주위를 한번 둘러보기 바란다. 그리고 눈에 보인는 모든 것을 한번 말해보자. 책, 컴퓨터, 조명, 거실 등 여러분이 말할 수 있는 모든 것이 바로 물체, 즉 객체(Object)인 것이다.


세상은 모든 것이 객체로 이루어져 있다. 앞에서 말한 객체 지향에서 모든 것은 객체로 이루어져 있다는 말과 비슷하게 들리지 않는가? 이 두 말은 분명 같은 뜻을 내포하고 있다. 객체 지향 프로그래밍이 라는것은 결국 실제의 세계와 가장 비슷한 형태로 프로그래밍을 할 수 있는 방법을 제공해 주는 프로그래밍 방법론이다.


여기서 객체에 대해서 한번 더 생각해 보자. 우리가 일상에서 사용하는 컴퓨터, 휴대폰, 책상, 등 지칭할 수 있는 모든걸을 객체라고 말할 수 있다. 이러한 것들은 볼 수 있거나 또는 만질 수 있기 때문에 이것을 객체라고 할 수 있는것이다. 즉 그것이 존재하기 때문에 그것을 객체라고 말할 수 있는것이다. 이러한 객체에 대한 일상의 개념들을 객체 지향 프로그래밍은 그대로 언어에 반영하였다. 그러나 실제의 세계와 프로그래밍과는 엄연한 차이가 존 재하기 때문에 약간의 개념이 프로그래밍에는 더 추가가 되어 있다. 그 중 하나가 바로 클래스라는 것이다.


실제 세계에서 휴대폰이라고 말하면 그것이 무엇인지 쉽게 알 수 있지만 프로그래밍 내에서 휴대폰이라고 한다면 무엇을 말하는 것인지 알 수가 없다. 프로그래밍 내에서 휴대폰이 무엇인지를 알려주어야만 하는데, 이때 바로 클래스를 사용한다. 휴대폰이 어떻게 생겼는지, 무슨 색인지, 어떻게 동작하는지 등에 대한 자세한 설명을 담아 놓은 것이 바로 클래스이다. 즉 실제 객체 설명서, 설계서, 명세서와 같은 역할을 하는 것이 바로 클래스이다. 그리고 객체를 클래스로 전환하는 과정을 모델링이라고 하는것이다.


객체라는 것은 볼 수 있거나 만질 수 있기 때문에 그렇게 부르는 것이다. 그럼 프로그래밍 내에서는 이런 객체의 기준이 무엇일까? 조금은 어려울 수고 있는데 정답은 바로 메모리에 있다. 메모리에 해당 클래스의 실체가 존재하면 그것을 객체라고 부르는 것이다. 이것은 컴퓨터에 대한 약간의 지식을 필요로 한다.


램(메모리)이라고 부르는 것은 실제 CPU가 작업할 때 작업할 것에 대한 내용을 담아두는 곳이다. 보통 작업 테이블에 비유하곤 한다. 이곳에 작업할 내용이 올라와 있다면 CPU는 작업할 수 있을 것이고, 없다면 당연히 작업을 진행할 수 없을 것이다. 실제 세계의 객체가 볼 수 있고 만질 수 있는 것과 마찬가지로 프로그래밍에서의 객체란 바로 메모리에 그 내용이 올라와 CPU가 그것을 볼 수 있고 만질 수 있어서 작업을 할 수 있는 상태를 말하는 것이다.


다시 객체와 클래스로 돌아와서 우리가 만든 Phone 클래스는 아직 메모리에 그 실체가 존재하지 않는다. 즉 Phone 클래스의 객체가 메모리에 존재하지 않기 때문에 아직 이것을 이용할 수 없다.


그럼 지금 만든 클래스를 사용하기위해서 필요한 것은 무엇이겠는가? 물론 클래스에 대한 객체를 만들면 이것을 사용할 수 있다. 자바에서 이 작업은 간단히 new라는 키워드를 사용함으로써 수행할 수 있다. 지금 만든 클래스의 이름이 Phone 이라면 객체는 다음과 같은 방법을 통해서 만들어진다.


              Phone phone = new Phone();         //phone 객체 생성


이제 휴대폰에 대한 객체가 메모리에 만들어졌으며 phone 이란 변수를 통해서 이 객체를 이용할 수 있게 되었다. 참고로 객체레 대한 변수는 레퍼런스 변수라고 한다.

2008. 8. 14. 16:34

[아시나요?]객체 지향 언어_2

2 . 객체 지향 프로그래밍

절차 지향 프로그래밍이 데이터화 로직을 중심으로 프로그래밍의 방향을 이끌었다명, 객체 지향 프로그래밍은 클래스를 중심으로 진행되었다. 특히 현실 세계의 사고 방식을 프로그래밍에서 그래로 사용할 수 있게 했다는 점도 빼놓을 수 없는 특징이다.


객체 지향 언어는 클래스를 프로그램의 최소 단위로 한다. 아무리 작은 프로그램이라도 최소한 하나 이상의 클래스로 이루어져 있어야만 한다. 클래스란 객체의 특징과 성질을 나타내는 변수와 이 변수를 제어할 수 있는 메소드로 이루어진 객체의 명세서이다. 즉 객체의 변수와 이 변수를 조작할 수 이쓴ㄴ 메소드가 하나의 묶음으로 존재하는 것이다. 객체를 클래스로 변환하는 과정을 객체 모델링이라고 하는데, 이에 대한 자세한 내용은 뒤에서 다시 언급할 것이다.



객체 지향 언어는 프로그램을 모듈 단위로 분리하여 개발할 수 있기 때문에 다른 사람과의 협조가 필요한 대규모 프로젝트에 적합하다. 흔히 모듈화라고 하는 이러한 특징은 하나의 프로그램을 몇 개의 기능(모듈)으로 분리해 각 기능을 따로 개발한 후에 이들을 조립함으로써 프로그램을 완성할 수 있는 방법을 제공한다. 보통 하나의 모듈은 몇 개의 클래스가 모여서 만들어진다.


그리고 이미 개발된 모듈은 다른 프로그램에서 재사용할 수 있고, 완성된 프로그램에 어떠한 수정이 필요할 경우 프로그램 전체에 영향을 끼치지 않고 수정이 필요한 모듈만 수정하면 되기 때문에 프로그램의 유지보수에도 용이하다. 또한 모듈은 복잡한 내부 구현을 사용자로부터 감추고 이 모든 모듈을 제어할 수 있는 인터페이스(메소드)만 제공해 줌으로써 사용자가 모듈에 대한 내용을 알지 못하더라도 이 모듈을 편리하게 이용할 수 있는 방법을 제공해 주었다. 즉 사용자는 모듈의 세세한 구현 사항에 대해서 전혀 알 필요가 없다

 

2008. 8. 14. 16:32

[아시나요?]객체 지향 언어1

1.절차 지향 프로그래밍


객체 지향 이전의 프로그래밍 방법을 흔히 절차 지향 프로그래밍 또는 구조적 프로그래밍이라고 한다. 이들에 대해서 간단히 설명하자면 이들을 대단히 구조적으로, 또한 대단히 순서적으로 만들어져 있다는 것이다. 이들 최대 관심사는 얼마나 효율적으로, 얼마나 빠르게 연산을 수행할 수 있는가 하는것이다. 프로그래밍의 관심사는 얼마나 효율적으로, 얼마나 빠르게 연산을 수행할 수 있는가 하는 것이다. 프로그래밍의 관심사가 연산의 속도와 효율성에 맞춰진 것은 당시 상황이 이러한 것들을 필요로 햇기 때문이다. 그 당시에 컴퓨터화 프로그램을 필요로하건 거의 모든 분야가 엄청난 수의 계산을 필요로 하던 곳이었다. 최초의 컴퓨터라고 불리는 애니악의 용도가 탄도계산이었다는 사실만 봐도 이말은 쉽게 공감할 수 있을것이다.


이때의 컴퓨터는 일종의 계산기 정도의 역할만 수행할 수 있으면 되었다. 당연히 프로그래밍의 모든 초점은 계산을 하는데 필요한 데이터와 어떻게하면 이 데이터를 보다 빠르고 효율적으로 이용할 수 있을까에 초점이 맞춰지게 된 것이다. 프로그램의 모든 흐름은 데이터를 중심으로움직였고 이방법은 당시로서는 최상의 선택이었다. 이때의 프로그래밍이라는 것은 가장 중요한 데이터를 중심에두고 여러 함수가 이 데이터를 가공하는 일련의 작업을 수행하는 것이었다.


이들은 마치 톱니바뀌와 같이 모든 일이 곡 마추어진 순서에 의해서 진행된다. 1번함수가 데이터를 가공하면 2번함수가 다음 작업을 처리하고. 다음은 3번이나 4번 함수가 작업을 처리하게 된다. 물론 이러한 방법이 가장 좋은 연산 성능을 이끌어내기 위한 것임은 말할 것도 없다. 그리고 더 중요한 것은 이것이상의 방법을 필요로 하지 않았다는 것이다.


간단하게 지금의 계산기를 생각해보자. 사용자는 계산기를 사용하면서 많은 것을 요구하지 않는다. 단지 얼마나 빨리 정확한 계산 결과를 돌려주느냐 하는 것에만 관심을 가질뿐이다. 절차 지향프로그래밍은 이러한 요구사항을 받아들여 가장 최적의 계산능력을 수행할 수 있도록 발전되어 왔고, 프로그램의 요구사항을 처리하는데도 아무 문데가 발생하지 않았다.


그러나 문제는 컴퓨터가 점점 더 많은 일을 처리하면서 생기기 시작했다. 이제 컴퓨터는 단순히 계산만을 하던 물건에서 벗어나 데이터 처리는 물론이고 결과의 출려과 보관, 그외의 워드프로세싱이나 그래픽 등 다양한 용도로 사용되고 있다. 당연히 이들 분야에서 필요로 하는 프로그램의 양은 많아졌고. 점점 더 복잡한 프로그램을 요구하게 되었다. 프로그래밍의 양은 이전과 비교했을 때 기하급수적으로 증가 했고, 혼자서 만든다는 것은 상상할 수도 없는 엄청난 규모의 프로그램을 필요로 하게 되었다. 이때부터 절차 지향 언어는 그 한계를 드러내기 시작했다.


우선 절차 지향 언어는 짜여진 순서에 의해 일을 진행하기 때문에 만일 이들 중 어느 한 부분이 수정이나 추가, 삭제되어야 한다면 이것은 한 부분만의 문제가 아니라 프로그램 전체에 막대한 영향을 줄수있다. 또한 순서와 앞뒤과정이 중요하기 때문에 규모가 큰 프로그램을 다른 사람과 공유하여 개발하기가 힘들어지면서 절차 지향 언어는 프로그램 유지 보수의 어려움과 대규모 프로젝트 추진에서 상당한 단점을 보이게 되었다. 그리고 이러한 단점은 시간이 지날수록 치명적인 약점으로 바뀌게 되었다. 이러한 절차 지향의 단점을 보완하고자 나온 방법이 바로 객체 지향 프로그래밍이다.

'My work space > Java' 카테고리의 다른 글

[아시나요?]객체  (0) 2008.08.14
[아시나요?]객체 지향 언어_2  (0) 2008.08.14
[아시나요?]배열  (0) 2008.08.14
[아시나요?]조건연산 , 비트연산 , 시프트연산  (0) 2008.08.14
[아시나요?]이스케이프 문자  (0) 2008.08.14
2008. 8. 14. 16:31

[아시나요?]배열

배열이란 같은 형의 데이터 타입을 동시에 담을 수 있는 순차적인 공간이다.

 

1.1차원배열


다음은 int형의 데이터 타입 5개를 사용할 수 있는 배열을 생성한 것이다. 배열이 사용할 메모이 공간을 할당받기 위해서는 new를 사용해야만 한다.

    

int[] score = new int[5];               //5개의 int형 데이터를 사용할 수 있다.


이렇게 선언한 배열에 접근하기 위해서는 배열의 인덱스를 알아야 한다. 인덱스란 배열의 순서를 말하는데 항상 0부터 시작한다.


                     score    0    1    2    3    4     <<<---배열의 인덱스     ㄱ

                               []    []    []   []    []                             ㅣ ------>>>>>>>>>>>>>> 배열의 기본 구조

                           배열에는 아무 내용도 저장되어 있지 않다.                     」


배열이 생성되어 있기는 하지만 아직 배열에는 어떤 데이터도 포함되어 있지 않다. 배열에 데이터를 추가하기 위해서는 배열의 인덱스를 이용해서 데이터를 배열에 대입해야 한다.

score[0] = 100;

score[1] = 90;

score[2] = 80;

score[3] = 85;

score[4] = 70;

이와 같은 데이터 초기화 작업으로 이제 배열은 다음과 같은 형태를 가지게 되었다.

                               0     1    2    3    4      <<< 인덱스

                     score [100] [90] [80] [85] [70]    <<< 배열에 저장되어 있는 내용


앞에서 추가한 배열의 데이터를 이용하기 위해서도 역시 인덱스를 사용해야 한다.


                         int value1 = score[0];    //인텍스가 0인 배열의 값

                         int value2 = score[3];    //인덱스가 3인 배열의 값

배열을 사용할 때 주의점

  •      반드시 new를 사용하여 배열을 생성해 주어야 한다.

배열은 일반 데이터 변수와는 조금 다른 성질을 갖고 있기 때문에 배열이 사용할 메모리 공간을 사용자가 직접 할당해야 한다. 바로 이 메모리 할당 작업을 new라는 문장을 통해서 수행하게 된다. 배열을 다음과 같이 선언만 해놓았다면, 이 배열은 프로그램에서 사용할 수 없다.


char[] chArray;              //단순히 배열의 이름만 선언


반드시 new를 사용하여 메모리 할당 작업을 수행해야만 배열을 사용할 수 있다. 그리고 이 작업과 함께 사용할 배열의 크기도 지정해 주어야 한다.


char[] chArray;              //배열의 이름 선언

chArray = new char[10];    //배열의크기를 지정하고, 메모리를 할당 받는다.


만일 배열을 생성할 당시 배열에서 사용할 데이터를 미리 알고 있다면, 다음과 같은 방법을 통해서 배열의 생성과 데이터 초기화 작업을 동시에 수행할 수도 있다. 이때 배열의 크기는 초기화 데이터의 수와 같다. 참고로 배열의 크기는 length라는 필드를 통해서 알 수 있다.

int[] score = { 100 , 90 , 80 , 70 , 60 };             //배열의 생성과 데이터초기화 작업을 동시에

int arrLength = score.length;                          //배열의 크기

  • 인덱스의 시작은 0 이다

배열에서 인덱스는 항상 0 부터 시작하기 때문에 언제나 지정한 배열의 순번보다 1만큼 작게 된다. 즉 4번째 배열의 값을 알기 위해서는 인덱스로 3을 사용해야만 한다.

            int value = score[3];                    //4번재 배열을 값

  • 배열은 생성시에 한번 정해지면 다시는 배열의 크기를 조정할 수 없다.

배열의 크기는 한번 정해지면 다시는 변경할 수 없기 때문에 처음 생성시 필요한 배열의 크기를 정화히 지정해 주어야 한다.  


2 . 2차원 배열

 

앞에서 사용한 일반적인 배열을 1차원 배열이라고 한다.배열은 1차원 뱅ㄹ 외에 2차원이나 3차원 등의 다차원 배열을 사용할 수도 있지만 3차원 배열 이후는 너무 복잡하기 때문에 잘 사용하지 않는다. 2차원 배열은 다음과 같이 두 개의 인덱스를 사용한다.


 int[][] arr = new int[4][4];


이와 같은 선언언 4*4의 크기를 가지는 2차운 배열을 생성한다.


                                                                                                                         2차원 배열의 구조


배열의 위치는 그림과 같이 두 개의 인덱스를 이용해서 지정해 주는 데 일반 좌표를 지정하는 방식과 동일하다. 그림에서 ? 의 위치는 arr[1][2]로 표시 한다. 2차원 배열은 보통 다음과 같이 중첩된 루프를 이용해 배열의 값을 초기화 하거나 배열에서 값을 읽어 들인다. 다음은 배열의 모든 값을 5로 초기화 한 것이다.


for(int i = 0 ; i<4 ; i++){

     for(int j = 0 ; j<4 ; j++){

          arr[ i ] [ j ] = 5;

      }

}


2차원 배열도 다음과 같이 배열의 생성과 동시에 값을 초기화할 수 있다.


int[][] arr = {{ 1 , 2 , 3 },

               { 11 , 22 , 33 },

               { 111 , 222 , 333 },

               };


2차원 배열의 크기를 알아내는 것은 1차원 배열보다 좀더 복잡하다. 2차원 배열은 다음 그림과 같이 1차원 배열의 조합으로 이루어진 배열이기 때문에 2차원 배열의 세로축은 arr.length로 구할 수 있지만, 가로축은 각각의 1차원 배열 길이를 구해야만 한다.



------------------------------------------------------------------
1. new 이용
String [] names = new String[3];
names[0] = "홍길동";
names[1] = "이순신";
names[2] = "유관순";

2. 나열방법
String [ ] names2 = { "홍길동" , "이순신" , "유관순" };

3. 혼합방법
String [] names3 = new String[] { "홍길동" , "이순신" , "유관순" };

2008. 8. 14. 16:30

[아시나요?]조건연산 , 비트연산 , 시프트연산

1.조건연산

 

조건 연산은 true나 false같은 논리적은 데이터 타입만 사용하여 AND 와 OR연산을 수행한다


조건연산자

 관계 연산자  의미
 A&&B  AND 연산, A와 B가 모두 true일 때만 결과가 true
 A||B  OR 연산, A와 B 둘 중 하나라도 true이면 결과는 true


연산의 효율성을 위해 A&&B연산에서 A가 false라면 결과는 당연히 false이기 때문에 B문장은 계산하지 않는다. 같은 이유로 A||B연산에서 A가 true라면 결과 또한 true라면 결과 또한 true이기 때문에 B문장을 계산하지 않는다. 조건연산자는 실제 프로그램에서 다음과 같이 사용할 수 있다.


boolean result;

int op1 = 30;

int op2 = 50;


result = true && false ;                      //result = false

result = true || false ;                       //result = true

result = (10<20)&&(10==10);                //result = true

result = (op1==op2) || (op1>==op2);       //result = false



2.비트연산

 

자바에서 비트 연산은 정수형 데이터 타입만 사용할 수 있다. 비트연산을 이용하면 정수형 데이터 타입을 비트 단위에서 제어 할 수 있다. 즉 데이터 처리의 단위가  int나 byte의 값이 아니라, 이들을 구성하고 있는 가 비트 단위로 연산을 수행할 수 있다. 비트 연산을 이해하기 위새서는 2진수와 16진수에 대한 약간의 지식을 필요로 한다. 여기서 그 방법을 자세히는 설명할수 없고 몇가지 진법변환의 예만 보이겠다.

 10진수  1  13  100  253
 2진수  0000 0001  0000 1101  0110 0100  1111 1101
 16진수  1x01  1x0D  0x64  0xFD


비트연산에 사용할 수 있는 비트 연산자는 다음과 같이 4가지 종류가 있다. 이들의 용어 정도는 한번쯤 들어보았을 것이다.

& (AND연산)  ,  | (OR연산)  ,  ^ (XOR연산)  ,  ~ (NOT연산)


 AND 연산 :  대응되는 비트의 조합이 모두 1일 때 결과가 1이다. 이것 이외에는 모두 0 이다 .

            10101010

AND        00001111

            00001010


AND 연산을 자바로 수행하는 방법은 다음과 같다.


int op1 = 0xAA;              //10101010

int op2 = 0x0F;              //00001111

int result = op1 & op2;    //00001010 >>>10진수의 10


 OR 연산 : 대응되는 비트중 하나라도 1이라면 결과는 1이다. 모두가 0일 때만 결과가 0 이다.

               00110011

OR            00001111

               00111111


OR 연산을 자바로 수행하는 방법은 다음과 같다.


int op1 = 0x33;              //00110011

int op2 = 0x0F;              //00001111

int result = op1 | op2;     //00111111 >>>>>10진수 63


 XOR 연산 : 대응되는 비트가 다르면 1, 같으면 0 이다. 즉 0-0이나 1-1과 같이 대응되는 비트가 같다면 결과는 0 이고 , 1-0 이나 0-1과 같이 대응되는 비트가 다르다면 결과는 1이다.

              11001100

XOR          11110000

              00111100


XOR 연산을 자바로 수행하는 방법은 다음과 같다.


int op1 = 0xCC;              //11001100

int op2 = 0xF0;              //11110000

int result = op1 ^ op2;     //00111100 >>>>>10진수 60  


 NOT 연산 : 0은 1로, 1은 0으로 반전시킨다.

               11001100

NOT         

               00110011


NOT 연산을 자바로 수행하는 방법은 다음과 같다.


int op1 = 0xCC;                //11001100

int result = 0xFF & (~op1);  //00110011


비트연산자를 사용하면 특정 비트의 값이 참인지 거짓인지( 0 또는 1 )를 쉽게 판단할 수 있다. 이러한 연산은 비트별로 어떤특정한 의미를 부여했을 경우 효과적으로 사용할 수 있다. 다음은 시스템 플래그(sysFlag)라는 정수현 변수의 각 비트에 시스템의 산황을 알 수 있는 특별한 의미를 부여했을 때의 결과이다.


이 시스템 플래그의 각 비트를 이용하면 원하는 시스템의 상황을 알 수 있다. 만일 시스템에 오류가 발생한 적이 있는지를 알아보기 위해서는 네 번째 비트의 값을 알면된다.

               boolean result = (sysFlag & 0x08) ==0x08;

result의 값이 true라면 에러가 발생한 적이 있고, false라면 발생한 적이 없다는 것이다. 그림으로는 현재 result가 true이다. 이와는 반대로 특정한 비트의 값을 설정할 수도 있는데. CPU 사용률을 정상이 아니게 설정 하는 방법이다

               sysFlag = sysFlag | 0x08;

OR연산은 대입연산자를 사용해 좀더 편리하게 나타낼 수 있다.

               sysFlag | =0x80;


3.시프트연산

비트연산에는 비트 전체를 왼쪽이나 오른쪽으로 이동할 수 있는 시프트 연산자를 제공한다. 10010(18)을 오른쪽으로 1만큼 시프트하면 남는 최상위 비트는 부호 비트로 채워지고 결과는 01001(9)이 된다. 시프트하고 난 후의 값은 처음의 1/2이다.

 


시프트 연산은 다음과 같이 3가지 연산자를 이용할 수 있다.

<<< : 이러한 연산자는 존재하지 않는다.

 >>  오른쪽으로 이동하면서 왼쪽의 빈 공간에는 부호 비트의 값을 채움
 <<  왼쪽으로 이동하면서 오른쪽의 빈 공간에 0 을 채움
 >>>  오른쪽으로 이동하면서 왼쪽의 빈 공간에 0 을 채움

'My work space > Java' 카테고리의 다른 글

[아시나요?]객체 지향 언어1  (0) 2008.08.14
[아시나요?]배열  (0) 2008.08.14
[아시나요?]이스케이프 문자  (0) 2008.08.14
[아시나요?]데이터 타입  (0) 2008.08.14
[아시나요?]메소드  (0) 2008.08.14
2008. 8. 14. 16:29

[아시나요?]이스케이프 문자

char변수에 ' 자체를 할당한다고 생각해 보면 아마도 다음과 같은 문장을 생각해낼 수 있을 것이다.


char quote =  " ' ;  //에러


그러나 아쉽게도 생각하는것돠 다르게 에러이다. 컴파일러는 이문장을 해석 할수가 없다. 이런 특수문자를 위해 이스케이프 문자를 사용할 수 있다. 다음은 이스케이프 문자를 사용해서 표현할 수 있는 특수문자이다.


이스케이프문자

 이스케이프 문자  의미

 \b

 BackSpace
 \t  Tab
 \n  New Line
 \r  Carriage return
 \"  Double quote
 \'  Single quote
 \  Backslash


만약 단일 인용부호( ' ) 를 나타내고 싶으면 다음처럼 사용한다.

char quot = ' \' ' ;      //  ' 의표현

'My work space > Java' 카테고리의 다른 글

[아시나요?]배열  (0) 2008.08.14
[아시나요?]조건연산 , 비트연산 , 시프트연산  (0) 2008.08.14
[아시나요?]데이터 타입  (0) 2008.08.14
[아시나요?]메소드  (0) 2008.08.14
[아시나요?]JDK  (0) 2008.08.14