728x90
반응형

변수의 종류

 선언 위치에 따른 변수의 종류 : 변수의 선언 위치가 변수의 종류와 범위를 결정한다.


 ▶인스턴스 변수

   - 각 객체의개별적인 저장 공간, 객체마다 다른 값 저장 가능

   - 객체(인스턴스) 생성 후, '참조변수.인스턴스변수명'으로 접근

   - 객체를 생성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해 자동으로 제거된다.


▶클래스 변수

   - 같은 클래스의 모든 인스턴스들이 공유하는 변수

   - 인스턴스 생성없이 '클래스이름.클래스변수명'으로 접근

   - 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸


▶지역 변수

   - 메서드(함수) 내에 선언되며, 메서드의 종료와 함께 소멸

   - 조건문, 반복문의 블럭 { } 내에 선언된 지역변수는 블럭을 벗어나면 소멸

 


클래스 변수와 인스턴스 변수

 인스턴스 변수 :: 객체가 생성될 때마다 생성되므로 객체마다 각각 다른 값을 가진다.

 클래스 변수 :: 모든 객체가 하나의 저장공간을 공유하므로 항상 공통된 값을 가진다.


인스턴스 변수(필드)의 선언

 public  int  speed;

public -> 접근지정자; private이나 public

int -> 필드의 타입

speed -> 필드의 이름


접근지정자(접근제어자) :: 어떤 클래스가 변수에 접근할 수 있는지를 표시한다.

public :: 모든 클래스로부터 접근이 가능하다.

private :: 클래스 내부에서만 접근이 가능하다.


<인스턴스 변수의 사용범위>

 인스턴스 변수는 선언 위치에 상관없이 클래스안의 어디서나 사용이 가능하다.




<클래스 변수와 인스턴스 변수>




지역 변수

 메서드(함수) 안에 선언하는 변수

public class Box {

  int width=0,length=0,height=0;  //인스턴스 변수(클래스에서 사용가능)

 

  public int getVol()

  {

      int vloume;    //지열 변수(getVol()안에서만 사용가능)

      volume=width*length*height;

      return volume;

   }


  volume=500;   //오류발생

}


지역 변수 사용시 주의점

 지역변수를 초기화하지 않고 사용하면 컴파일 오류 발생한다.

 오류 메세지: The local variable sum may not have been initialized

public class Bug {

   public int getSum()

   {

        int sum;

        for(int i=0; i<10; i++)

             sum=sum+i;  //오류발생

        return sum;  //오류발생

   }

}

728x90
반응형
728x90
반응형

클래스(class)와 객체(object)


클래스 :: 객체를 정의해 놓은 것으로 객체를 생성하는데 사용된다.

객체 :: 실제로 존재하는 사물 또는 개념으로 객체의 속성과 기능에 따라 다르다.

-> 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다.

설계도만 잘 만들어 놓으면 제품을 만들때마다 매번 고민할 필요없이 설계도에서 정해진 규칙대로만 만들면 된다.

마찬가지로 클래스 하나만 잘 만들어 놓으면 많은 수의 객체를 만드는 것도 고민없이 간단히 처리할 수 있다.

-> 객체는 서로 독립적이다. 같은 클래스로부터 생성된 객체일지라도 서로 독립적이어서 한 객체의 변화가 다른 객체에 영향을 주지 않는

         클래스             객체

       제품 설계도        제품

        TV 설계도          TV

      붕어빵 기계       붕어빵


클래스의 정의

클래스 :: 데이터와 함수의 결합

데이터 저장형태의 발전과정 :: 변수는 하나의 값만 저장 -> 같은 타입의 여러데이터를 저장할 수 있는 배열 도입 -> 타입은 다르지만 서로 관련된 데이터를 하나로 묶어서 저장할 수 있는 구조체 도입 -> 서로 관련된 데이터와 함수를 결합한 클래스 도입

변수 : 하나의 데이터를 저장할 수 있는 공간

배열 : 같은 타입의 여러 데이터를 저장할 수 있는 공간

구조체 : 타입에 관계없이 서로 관련된 데이터들을 저장할 수 있는 공간

클래스 : 데이터와 함수의 결합(구조체+합수)



클래스(class) :: 객체를 만드는 설계도. 클래스로부터 만들어지는 각각의 객체를 특별히 그 클래스의 인스턴스(instance)라고도 한다.

객체(object) :: 상태와 동작을 가진다. 객체의 상태는 객체의 특징값(속성) -> 멤버(인스턴스)변수 이다. 객체의 동작은 객체가 취할 수 있는 동작 -> 메서드 이다.



객체의 구성요소 :: 속성(상태)과 기능(동작)으로 이루어져 있다.

객체는 속성과 기능의 집합이며, 속성과 기능을 객체의 멤버라고 한다.

클래스를 정의할 때 속성(상태)은 변수로, 기능(동작)은 메서드로 정의한다.



객체를 생성하는 방법

Car myCar=mew Car();

※자바에서 객체를 생성하는 방법은 new한가지 뿐이다.




객체의 생성과 사용

 <객체의 생성 방법>

   클래스명 변수명;              //객체를 다루기 위한 참조변수 선언

   변수명=new 클래스명();    //객체생성 후, 생성된 객체의 주소를 참조변수에 저장

 예1) TV t;                         //TV타입의 참조변수 t선언

        t=new TV();               //new연산자 사용하여 TV객체 생성

 예2)TV t= new TV();          //한 줄로 줄여서 표현 가능


 new연산자는 인스턴스를 생성할 클래스를 읽어서 인스턴스 생성에 필요한 메모리를 계산한다음, 메모리의 빈 공간을 찾아 객체를 생성하고 생성된 객체의 메모리 주소를 반환한다.

 - 참조변수는 인스턴스를 다룰 수 있는 유일한 방법이기 때문에 참조변수가 없으면 인스턴스를 사용할 수 없다. 사용할 수 없는 인스턴스는 JVM의 가비지컬렉터에 의해서 적절한 시기에 자동적으로 메모리에서 제거된다. 그래서 사용되지 않는 인스턴스를 제거하는데 신경쓰지 않아도 되기 때문에 메모리관리 부담이 없다는 것이 JAVA의 큰 장점이다.

 - 참조변수 t가 TV인스턴스를 참조하고 있다. (t는 TV의 리모콘에 비유)




TV t1 = new TV();     //TV객체를 참조하는 t1변수 선언

TV t2 = new TV();     //TV객체를 참조하는 t2변수 선언

t2 = t1;                     //참조변수 t1의 값을 t2에 저장(복사)

t1.channel=7;

System.out.println(t1.channel);    //7출력

System.out.println(t2.channel);    //7출력

728x90
반응형
728x90
반응형

객체지향 ? 실제 세계를 모델링하여 소프트웨어를 개발하는 방법


절차 지향 프로그래밍(procedural programming) : 문제를 해결하는 절차를 중요하게 생각하는 방법

 - 데이터와 알고리즘이 묶여있지 않다.


객체 지향 프로그래밍(Object-Oriented Programming) : 데이터와 절차를 하나의 덩어리(객체)로 묶어서 생각하는 방법

 - 객체 지향 소프트웨어를 작성하는 것은 컴퓨터 하드웨어 부품을 구입하여서 컴퓨터를 조립하는 것과 비슷하다.

 - 데이터와 알고리즘이 묶여있다.


객체 지향 언어의 특징

 ▶ 기존의 프로그래밍언어와 크게 다르지 않다.

       - 기존의 프로그래밍 언어에 몇가지 규칙을 추가한 것일 뿐이다.

       - 3가지 중요 관점 : 재사용성, 유지보수, 중복의 제거

 

 ▶ 코드의 재사용성이 높다.

       - 클래스를 정의하고 상속이라는 기능을 통해 기존에 작성된 코드를 이용하여 새로운 코드를 쉽게 작성할 수 있다.

 ▶ 코드의 관리가 쉬워졌다.

       - 기존의 절차적 언어에서는 프로그램의 일부를 변경할 때 변경된 코드와 관련된 부분도 일일이 수정해야하지만, 객체지향 언어에서는 코드간의 관계를 맺어줄수 있기 때문에 코드가 변경되면 관련된 코드들도 자동적으로 변경되는것과 같은 결과를 얻을 수 있어서 코드를 관리하는 것이 쉽다.

 ▶ 신뢰성이 높은 프로그램의 개발을 가능하게 한다.

       - 제어자와 메서드를 통해서 중요한 데이터가 외부에서 임의로 변경되는 것으로부터 보호하고, 데이터가 적절하지 않은 값이 되는 것을 말을 수 있다. 예를 들어, 비밀번호와 같이 중요한 데이터를 외부에서 접근하지 못하게 하거나 날짜의 월 데이터가 13월이 되는 것 등을 막을 수 있다.


객체 재향의 3대 특징

-> 캡슐화(encapsulation) :: 관련된 데이터와 알고리즘(코드)이 하나의 묶음으로 정리되어 있는 것

-> 상속(inheritance) :: 이미 작성된 클래스(부모 클래스)를 이어받아서 새로운 클래스(자식 클래스)를 생성하는 기법. 기존의 코드를 재황욜하기 위한 기법.

-> 다형성 :: 하나의 이름(방법)으로 많은 상황에 대처하는 기법. 개념적으로 동일한 작업을 하는 멤버 함수들에 똑같은 이름을 부여 할 수 있으므로 코드가 더 간단해진다.



쉬은 디버깅

 예를 들어서 절차 지향 프로그램에서 하나의 변수를 1000개의 함수가 사용하고 있다고 가정해보자

 -> 하나의 변수를 1000개의 함수에서 변경할 수 있다.

 객체 지향 프로그램에서 100개의 클래스가 있고 클래스당 10개의 메소드를 가정해보자

 -> 하나의 변수를 10의 메소드에서 변경할 수 있다.

728x90
반응형
728x90
반응형

사용자 입력받기 - 커맨드라인

 커맨드라인에서 입력된 값들은 문자열 배열에 담겨 main메서드에 전달된다.

public static void main(Stirng[] args)

{

      System.out.println("매개변수의 개수:"+args.length);

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

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

      }

}

[실행 결과]

  매개변수의 개수:3

  args[0]="abc"

  args[1]="123"

  args[2]="Hello World"


<커맨드라인 입력>





사용자 입력받기 - 입력창(InputDialog)

 Swing패키지의 JOptionPane.showInputDialog() 를 사용




<입력창>

 

728x90
반응형
728x90
반응형

다차원 배열의 선언과 생성

'[]'의 갯수가 차원의 수를 의미한다.

 ->선언 방법                 ->선언 예

  타입[][]변수이름;       int[][]score;

  타입 변수이름[][];      int score[][];

  타입[] 변수이름[];      int[] score[];

※ int [][] score = new int [5][3]; //5행 3열의 2차원 배열을 생성한다.

 

가변 배열

 다차원 배열에서 마지막 차수의 크기를 지정하지 않고 각각 다르게 지정

 예) 

  int [][] score = new int[5][];    또는   int [][] score = {

  score[0] = new int [3];                             { {100, 100, 100},

  score[1] = new int [3];                                { 20,  20,  20 },

  score[2] = new int [3];                                { 30,  30,  30 },

  score[3] = new int [3];                                { 40,  40,  40 },

  socre[4] = new int [3];                                { 50,  50,  50 } };

  

  int [][] score = new int [5][];    또는   int [][] score = {

  score[0] = new int [4];                            { {100, 100, 100, 100},

  score[1] = new int [3];                               { 20,  20,  20 }, 

  score[2] = new int [2];                               { 30,  30 }, 

  score[3] = new int [2];                               { 40,  40 }, 

  score[4] = new int [3];                               { 50,  50,  50 } };

 

<이차원 배열>

 

 

 

 

for문을 이용한 배열의 복사

 int [] number = {1,2,3,4,5};

 int [] newNumber = new int [10];

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

       newNumber[i] = number[i];   //배열 number의 값은 newNumber에 저장한다.

 }

 

System.arraycopy()를 이용한 배열의 복사

 System.arraycopy(arr1, 0, arr2, 0, arr1.length);

                        -> arr1 [0]에서 arr2 [0]으로 arr1.length개의 데이터를 복사

 

<배열의 복사>

728x90
반응형

+ Recent posts