String 클래스와 배열
자바에서 문자열은 String 클래스의 객체이다. 

문자열 객체
String  sentenceOne = "This is a sentence."; 
 
▶ 문자열 "This is a sentence."는 String 클래스의 객체이며,    
sentenceOne은 String 객체를 가리키는 객체 참조변수이다. 
▶ 객체를 생성하는 연산자 new를 사용하지 않고, 
기본자료형의 변수처럼 초기화된 점이 다른 클래스의 객체 생성과 다르다.  
                                   String 참조변수
▶ String 객체는 상수로 컴파일러는 동일한 문자열 상수를 단 한번만 생성 

String  sentenceOne = "This is a sentence."; 
String  sentenceTwo = "This is a sentence."; 

                                두 String 참조변수

▶ String 객체는 한번 초기화된 값을 바꿀 수 없다   

String  sentenceOne = "This is a sentence."; 
sentenceOne = "This is a new string."   

                       새로운 객체를 가리키는 String 참조변수 문자열
▶ "This is a sentence."는 가리키는 변수가 없을 경우 자동적으로 소멸된다.

String 클래스의  생성자 (문자열을 인수로 받는다.)      
String  sentenceThree = new String ("This is one string.");
String  sentenceFour = new String (sentenceThree);

                                   동일한 String 객체의 생성

문자열 연결연산 (Concatenation Operator)

aString = "fly like a bird" + " on the wind"; 

▶ 두 개의 문자열을 연결시켜, 참조변수 aString이 가리키게 만든다.
▶ 연산자 + 대신 String 클래스의 concat() 메소드를 사용할 수도 있다. 
▶ aString과 bString이 문자열 객체를 가리키는 참조변수일때 명령문  aString.concat (bString); 은 두 문자열을 연결시킨 결과 문자열을 참조변수 aString의 객체로 반환한다.  


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

StringBuffer 클래스  (0) 2011.02.15
String 클래스의 메소드  (0) 2011.02.14
여러 종류의 객체  (0) 2011.02.11
인스턴스 변수와 정적 변수(Static Variables)  (0) 2011.02.10
인수 전달 기법  (0) 2011.02.09
여러 종류의 객체
패키지(Package)


패키지는 서로 연관된 여러 클래스를 모아서 하나의 디렉토리에 넣은 것으로,     

프로그램을 체계적으로 구성할 때 유용하게 사용된다. 



같은 이름의 클래스가 두 개의 패키지에 독립적으로 정의되었을 경우,    

두 클래스는 별개의 클래스이다. 



패키지의 이름은 클래스 이름에 포함된다. 

모든 클래스는 패키지에 포함되어 있다.

지금까지 작성된 패키지가 명시되지 않은 클라스는 자바 내에 디폴트 패키지에 속한다. 


패키지의 작성 


클래스를 패키지 내에 넣기 위해서는     

클래스가 정의된 화일의 첫 줄에 다음의 명령문을 삽입한다.        



package 패키지이름;   

package MyPackage;     

class Rectangle {         

// 클래스의 정의

}   



같은 패키지에 포함되는 모든 화일은 패키지의 이름과 같은 디렉토리에 저장한다. 

이 경우에는 MyPackage라는 디렉토리에 저장해야 한다.



패키지와 디렉토리 


클래스의 정의는 클래스의 이름과 같은 화일에 저장하고,    

패키지는 패키지의 이름과 같은 디렉토리에 저장한다. 

디렉토리가 서브디렉토리를 가지듯이, 패키지도 서브패키지를 가진다. 

패키지의 구성은  반드시 디렉토리의 구조와 일치해야 한다. 

예를 들면, 위에서 MyPackage에 속하는 모든 화일은 MyPackage 디렉토리에 저장된다. 

MyPackage 내의 클래스를 PackA와 PackB의 두 패키지 그룹으로 나눌 경우    

MyPackage 디렉토리는 하부에 PackA와 PackB라는 두 서브디렉토리를 가진다. 



ClassA를 PackA 패키지에 넣을 경우 클라스의 이름:  package MyPackage.PackA.ClassA;   



디렉토리 내의 클래스를 사용하기 위한 환경변수 CLASSPATH 설정.    

Windows 95의 경우 자바 표준패키지를 설정하는 방법은 autoexec.bat 화일에        

set CLASSPATH= .;C:\java\lib\classes.zip     



만약 C:\MyPackage 라는 패키지를 만들어 추가하려면 아래와 같이 설정한다.      

set CLASSPATH= .;C:\MyPackage;C:\java\lib\classes.zip 


set : 환경변수뜸.


접근 속성 (Access Attributes)

▶ 객체지향의 주요 특성인  추상자료형의 목적은 데이타 캡슐화이다. (데이터의 보호(숨김))
▶ 캡슐화란 외부에서 클래스의 정의에 명시해 놓은 인터페이스를 통해서만 
객체에 접근 캡슐화를 위해서 접근 속성을 이용하여 객체 내의 
인스턴스 변수나 메소드의 접근을 통제   

▶ 접근 속성 
· public - 어디서나 접근이 가능 (구조체는 기본적으로 다 public)
· private - 같은 클래스 내에서만 접근이 가능 
· protected - 같은 패키지 내의 클래스와 다른 패키지 내의 서브클래스에서만 접근 가능 
· 접근 속성이 명시되지 않은 경우에는 같은 패키지 내의 클래스에서만 접근이 가능하다.
패키지 내에서의 접근속성
패키지 간의 접근속성
▶ 객체지향 프로그램의 특성인 캡슐화를 위해서 접근속성을 명시하는 것이 좋다 
▶ 일반적으로 클래스 내의 모든 인스턴스 변수는 private으로 한다. 
▶ 외부에서 호출되는 것은 메소드는 public (외부로부터의 접근 통로 제공) 
▶ final로 선언된 인스턴스 변수가운데 외부에서 사용할 수 있는 경우는 public으로 한다.    
(Math 클래스에 있는 여러가지 유틸리티 메소드나 표준 데이타 값을 선언한 경우) 

▶ 접근 속성은 클래스에도 적용된다. 
▶ 클래스의 정의 앞에 접근 속성이 없을 경우는 같은 패키지 내의 클래스만이 접근 허용    
(다른 패키지의 클래스에서 import문을 통해서 사용하는 것을 허용치  않음)

▶ 다른 패키지의 클래스에서 사용하려면 예약어 class 앞에 접근 속성 public을 명시     
클래스는 접근 속성으로 private나 protected는 가질 수 없다. 
▶ 각 프로그램 화일은 여러 개의 클래스를 가질 수 있지만, public 클래스는 하나만 허용


this 객체
class a
{
   private:
      int a;
   public:
      void seta()
      {
         int a;
         this.a=3;
      }
}
a는 메소드(seta)의 a이고, 
this.a 는 클래스의 a이고 이것을 this 객체라고한다.



native method
*.obj 안에 있는 코드를 native code 라고함
자바가상머신 안에 있는 코드는 Byte code 라고함

자바 프로그램 내에 다른 프로그래밍 언어로 작성된 메소드를 
포함시킬 때 예약어 native을 사용한다. 
단점 : 자바의 장점인 호환성을 잃음.

JNI : 자바 네이티브 인터페이스 약어


어플리케이션 프로그램 객체

public class ApplicationClassA
{
  public static void main(String[] args)
  {
    int aLength =3;
    int aWidth = 5;
    int rectangleArea;
    ApplicationClassA z = new ApplicationClassA(); // 어플객체

    rectangleArea = z.area(aLength, aWidth);
    System.out.println("The area of rectangle is " + rectangleArea);
  }
  int area(int lengthint width)
  {
    return length*width;
  }
}
메세지를 ApplicationClassB 클래스의 객체 theApplication에게 보낸다. 
이와 같이 경우에 따라서 어플리케이션 객체를 생성해야 할 필요가 있다. 
이런 경우는  GUI 인터페이스의 이벤트 구동 프로그램에서 나타난다.  
애플릿 프로그램의 경우 웹 브라우져가 애플릿 객체를 생성하기 때문에 
프로그램 내에서 따로 객체를 생성하지 않아도 된다.   

위의 프로그램에서 어플리케이션 프로그램 객체를 생성하지 않고 
area() 메소드를 호출하려면, area() 메소드를 main() 메소드처럼 
static으로 정의하면 가능하다. 



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

String 클래스의 메소드  (0) 2011.02.14
String 클래스와 배열  (0) 2011.02.11
인스턴스 변수와 정적 변수(Static Variables)  (0) 2011.02.10
인수 전달 기법  (0) 2011.02.09
생성자(Class Constructors)  (0) 2011.02.08
인스턴스 변수와 정적 변수(Static Variables)
// 정적변수를 이용하여 생성된 Circle객체의 개수를 해아리는 프로그램

import java.io.*;

public class CircleArea 

    public static void main (String[] args) throws IOException 
  {
        BufferedReader stdin = new BufferedReader(new InputStreamReader (System.in));

        int rad, xPos, yPos;    // 지역변수
        String aString;      // 객체 참조 변수
        Circle aCircle;
        
        while(true// NULL과 같지않냐?
        {
            System.out.print ("\nEnter the radius <type enter-key to quit>: ");
            aString = stdin.readLine();
            if(aString.equals (""))
            {
                  break;
            }
            rad = Integer.parseInt (aString);
            System.out.print ("Enter the x coordinate of origin: ");
            xPos = Integer.parseInt (stdin.readLine());
            System.out.print ("Enter the y coordinate of origin: ");
            yPos = Integer.parseInt (stdin.readLine());

            aCircle = new Circle (xPos, yPos, rad);      
            aCircle.create();
        }      
        System.out.println ("This is the end of program."); 
    }
}

class Circle 
{
    static int count = 0;            // 정적 변수
    static final double PI = 3.14;   // 상수 (final : #define 과 같은 역할)
    int radius;                      // 원의 반지름    {
    int xCenter;                     // 중심의 x좌표  인스턴스 변수.
    int yCenter;                     // 중심의 y좌표   }

    Circle (int x, int y, int rad) 
    {
        xCenter = x;
        yCenter = y;
        radius = rad;
        count++;
    }
   
    void create()
    {
        System.out.println (count + " Object created."); 
    }
    double area() 
    {
        return  radius * radius * PI;
    }  // method area

    double circumference() 
    {
        return 2 * radius * radius * PI;
    }
}
클래스 ☞ 엄마 뱃속에 있는 아기 : 실제로 존재하지 않는 것. (class Circle { .... })
객체참조변수 ☞ 곧 태어날 아기의 이름 : 클래스에 이름을 부여. (Circle aCircle;)
객   체 ☞ 아기가 태어나 이름을 갖게 된것. 홍길동 : 객체참조변수에 공간을 확보. 인스턴스 객체라고도함
              (aCircle = new Circle (xPos, yPos, rad);)
인스턴스 변수 ☞ 클래스의 지역변수 (같은 클래스에 속하는 모든 객체가 서로 다른 메모리 공간을 차지함)
정적 변수 ☞ 클래스의 static변수 (같은 클래스에 속하는 모든 객체가 공유하며 객체를 생성하지 않아도 이미 존재한다.)
aString.equals : 문자열을 물어보는 메소드(aString.equals("") : NULL이냐고 물어보는 것);
메소드 오버로딩, 복사 생성자
// 세 사각형 면적의 합을 구하는 프로그램으로 메소드 오버로딩을 사용한다.

public class TotalArea
{
    public static void main (String[] args)
  {
        Rectangle rectA, rectB, rectC;

        rectA = new Rectangle();
    System.out.println("--------------------------------------");
        rectB = new Rectangle (1020);
    System.out.println("--------------------------------------");
        rectC = new Rectangle (15);
    System.out.println("--------------------------------------");
    Rectangle rectD = new Rectangle (rectA); // 객체가 복사됨
    System.out.println("--------------------------------------");
    Rectangle rectZ = rectA;  // 객체가 생성되지 않음.
    System.out.println("--------------------------------------");

        double area;
        area = rectA.area() + rectB.area() + rectC.area(); 
        System.out.println ("The total area of three rectangle is " + area);
    }
}

class Rectangle
{
    double length;
    double width;

    Rectangle(double l, double w)
  {
        length = l;
        width = w;
    System.out.println("인자 2개인 생성자 호출");
    } 

    Rectangle()
  {
        length = 10;
        width = 20;
    System.out.println("인자 없는 생성자 호출");
    }

    Rectangle(int size) 
  {
        length = size;
        width = size;
    System.out.println("인자 1개인 생성자 호출");
    }

  Rectangle(Rectangle oldRect)
  {
         length = oldRect.length;
     width = oldRect.width;     
     System.out.println("복사 생성자 호출");
  }   

    double area() 
  {
      return length * width;
    } // method area
// class Rectangle

정적 메소드 
☞ 메소드에 static이 붙음. 주의 할점
class A
{
int b;
int c;
static void test()
{
b=3;
}
}
a.test();
위와 같은 코드는 오류가 난다. 변수 b에 static을 붙여줘야 정상 작동한다.

메소드 오버로딩 ☞ 같은 이름의 메소드가 여러게 단. 인자가 달라야한다.(인자의 순서나 인자의 숫자로 구분)
이를 객체지향의 다형성이라고 부른다.

복사 생성자 ☞ 기존의 객체와 동일한 독립된 객체를 생성(오버로딩된 생산자의 정의)
이 생성자는 이미 존재하는 객체를 인수로 받아서, 기존 객체의 인스턴스 변수의 값을 새로운 객체의 인스턴스 변수에 부여함으로 기존 객체와 같은 새로운 객체를 생성할 수 있다. 


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

String 클래스와 배열  (0) 2011.02.11
여러 종류의 객체  (0) 2011.02.11
인수 전달 기법  (0) 2011.02.09
생성자(Class Constructors)  (0) 2011.02.08
정수 데이타의 입출력!!  (0) 2011.02.07

// 인수전달 방법을 보여주는 프로그램

public class ParameterClass
{
  private static void squareNumber(int oneF, Value twoF, Value threeF)
  { // static을 붙여야만 생성된다.
    System.out.println();
    System.out.println("Begining of squareNumber ");
    System.out.println("oneF : " + oneF);        // 8
    System.out.println("twoF : " + twoF.number);    // 9 
    System.out.println("threeF : " + threeF.number);  // 10

    oneF = oneF * oneF;
    twoF.number = twoF.number * twoF.number;
    threeF = new Value(25);

    System.out.println();
    System.out.println("End of squareNumber ");      
    System.out.println("oneF : " + oneF);        // 64
    System.out.println("twoF : " + twoF.number);    // 81
    System.out.println("threeF : " + threeF.number);  // 25
    }

  public static void main(String[] args)
  {
    int oneA = 8;
    Value twoA = new Value(9);
    Value threeA = new Value(10);

    System.out.println();
    System.out.println("Before call squareNumber ");  
    System.out.println("oneA : " + oneA);        // 8
    System.out.println("twoA : " + twoA.number);    // 9
    System.out.println("threeA : " + threeA.number);  // 10

    squareNumber(oneA, twoA, threeA);

    System.out.println();
    System.out.println("After call squareNumber ");
    System.out.println("oneA : " + oneA);        // 8
    System.out.println("twoA : " + twoA.number);    // 81
    System.out.println("threeA : " + threeA.number);  // 10

    return;
  }
}

class Value
{
  int number;  // 객체가 사라지지않는한 값은 남아있다.

  public Value(int num)
  {
    number = num;
  }
}
▶ squareNumber() 메소드의 형식인수 oneF는 기본자료형인 int형 (값전달방식)
twoF와 threeF는 Value 클래스의 객체 (참조전달방식)
int oneA = 8; int twoA = new Value (9); int threeA = new Value (10);
▶ squareNumber (oneA, twoA, threeA); 메소드를 호출한 직후의 상태 
oneF = oneF * oneF;
twoF.number = twoF.number * twoF.number;  
threeF = new Value (25);
squareNumber() 메소드의 실행이 끝나고, main() 메소드로 돌아왔을 때의 실인수  

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

여러 종류의 객체  (0) 2011.02.11
인스턴스 변수와 정적 변수(Static Variables)  (0) 2011.02.10
생성자(Class Constructors)  (0) 2011.02.08
정수 데이타의 입출력!!  (0) 2011.02.07
키보드 입력받기!! (C의 scanf)  (0) 2011.02.07
Rectangle.java
// Rectangle 클래스의 생성자 메소드를 정의하는 프로그램

class Rectangle
{
  int length;
  int width;

  // 클래스 생성자의 정의
  Rectangle (int len, int wid)
  {
    length = len;
    width = wid;
  }

  int area()
  {
    return length * width;
  } // method area
// class Rectangle
ShowConstructor.java
/* main() 메소드에서 클래스 생성자를 이용하여 
   Rectangle 클래스의 객체를 만드는 프로그램 */


public class ShowConstructor
{
  public static void main (String[] args)
  {
    int alength = 3;
    int awidth = 5;
    int rectanglearea;
    Rectangle aRectangle; // 객체 참조 변수.

    aRectangle = new Rectangle(alength, awidth); // 객체생성.
    rectanglearea = aRectangle.area();
    System.out.println("The area of rectangle is " + rectanglearea);
  }
}

생성자(Class Constructors) 
  • 생성자 - 생성된 클래스의 객체를 초기화하는 메소드 해당 클래스 내에서 정의된다.
  • 객체가 생성되면 생성자가 반드시 호출된다.
  • 기본자료형의 데이타는 이전의 언어에서처럼 변수의 선언으로 생성되지만, 클래스의 객체는 반드시 new 연산자와 생성자 메소드를 사용하여 생성한다.
  • 생성자는 반환값을 가지지 않으며, 항상 클래스와 같은 이름을 가진다.
  • 생성자는 필요에 따라 인수를 가지기도 하고, 가지지 않을 수도 있다.
  • 앞에서 정의한 Rectangle 클래스에 생성자를 다음과 같이 추가할 수 있다.
  • 여기서는 두 개의 int형 인수가 선언되어 있다 프로그램 설명 ▶ Rectangle aRectangle; Rectangle 클래스의 객체 참조변수 aRectangle의 선언 변수 aRectangle은 객체 자체가 아니다. 변수의 선언은 변수 aRectangle을 위한 메모리를 할당할 뿐이며, Rectangle 클래스의 객체가 생성되는 것은 아니다. 변수 aRectangle은 main() 메소드의 지역변수로, Rectangle 클래스의 객체를 가리킬 수 있는 참조변수이다. 생성된 aRectangle 변수는 미정값(undefined value)을 가지고 있다. 그림 4-2. 객체 참조변수 aRectangle ▶ aRectangle = new Rectangle (aLength, aWidth); 객체는 new 연산자클래스 생성자를 호출함으로써 생성된다. ▶ new 연산자 - 클래스의 인스턴스 변수를 위한 메모리를 할당하여 객체를 만들고, 인스턴스 변수를 디폴트 값으로 초기화한다. (숫자, 문자 - 0, 객체, 문자열 - null , boolean형- false 값) 인스턴스 변수의 초기화가 끝나면, new 연산자는 생성자 메소드를 호출한다. 실인수를 aLength와 aWidth로 하여 Rectangle 클래스의 생성자를 호출하여 새로운 객체를 초기화한다. 생성된 객체의 주소를 반환값으로 돌려보내, 변수 aRectangle에 저장한다. 변수 aRectangle은 객체 자체가 아니라, 객체를 가리킨다. (객체 메모리의 주소를 가짐: C 언어에서의 포인터변수) 객체 참조변수는 Rectangle 클래스의 객체를 가리키는 참조변수이지만, 표현의 편리를 위해 참조변수가 가리키는 객체를 "aRectangle 객체"라고 부른다. 객체 참조변수가 아무 객체도 가리키지 않는 상태로 만들려면 null 값을 부여한다. 그림 4-3. 객체의 생성 ▶ rectangleArea = aRectangle.area(); aRectangle 객체의 area() 메소드를 호출하고, 결과값을 rectangleArea 변수에 저장 객체 메소드의 호출형식: 객체 참조변수 + 다트(.) + 메소드의 이름 ▶ class Rectangle { int length; int width; ............ } 변수 length와 width는 클래스의 인스턴스 변수로, 객체가 생성될 때 디폴트 초기값 0 만약 클래스 내에 생성자가 정의되어 있지 않을 경우, 컴파일러가 아무런 작업도 수행하지 않는 디폴트 생성자(default constructor)를 내부적으로 만들어 준다. 디폴트생성자 : 인자를 가지고 있지 않은 생성자를 말한다.
구조체와 클래스의 차이점 ☞ 구조체는 메모리를 할당하지만 클래스는 메모리할당 + 행동을 취한다.

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

인스턴스 변수와 정적 변수(Static Variables)  (0) 2011.02.10
인수 전달 기법  (0) 2011.02.09
정수 데이타의 입출력!!  (0) 2011.02.07
키보드 입력받기!! (C의 scanf)  (0) 2011.02.07
print 와 println 의 차이점!  (0) 2011.02.07

+ Recent posts