페이지

2015. 1. 7.

[JAVA] Day3.객체지향과 변수의 종류

객체지향


객체지향언어란?

 - 객체는 메모리라고 생각하자.
 - 메모리에 올려서 쓰는것...
 - 즉, 메모리를 효과적으로 쓰기 위함




객체지향언어의 역사


 - 과학, 군사적 모의 실험을 위해 컴퓨터를 이용한 가상세계를 구현하려는 노력으로부터 객체지향이론이 시작됨.
 - 1960년대 최초의 객체지향언어 Simula탄생
 - 1980년대 절차방식의 프로그래밍의 한계를 객체지향방식으로 극복하려고 노력한 결과 C++, Smalltalk과 같은 보다 발전된 객체지향언어가 탄생함
 - 1995년 말 java탄생(객체지향언어가 프로그래밍 언어의 주류가 됨)





객체지향언어의 특징


1. 기존의 프로그래밍언어와 크게 다르지 않다.
2. 코드의 재사용성이 높다.
3. 코드의 관리가 쉬워졌다.
4. 신뢰성이 높은 프로그램의 개발을 가능하게 한다.








클래스와 객체

 - 클래스는 설계도
 - 객체는 메모리




클래스와 객체의 정의와 용도

클래스의 정의 - 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도 - 클래스는 객체를 생성하는데 사용된다.
객체의 정의 - 실제로 존재하는것. 사물 또는 개념.
객체의 용도 - 객체의 속성과 기능에 따라 다름.

클래스 : 제품 설계도, TV설계도, 붕어빵기계
객체  : 제품, TV, 붕어빵





객체와 인스턴스

 - 객체는 인스턴스는 거의 같은 말
 - 객체(object)는 인스턴스(instance)를 포함하는 일반적인 의미





인스턴스화

 - 클래스로부터 인스턴스를 생성하는 것.
 - 즉, 클래스를 인스턴스화 한결과가 인스턴스(객체)





객체의 구성요소 - 속성과 기능

 - 객체는 속성과 기능으로 이루어져 있으며 속성은 변수로, 기능은 메서드로 정의한다.

TV라는 객체는
속성으로 크기, 길이, 높이, 색상, 볼륨, 채널등이 있고,
기능으로 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 높이기 등이 있다.





인스턴스의 생성과 사용

객체는 누가 생성하느냐? main메서드가 생성한다.
main메서드를 공장이라고 한다.



인스턴스의 생성방법

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

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


배열의 경우 new를 쓰게 되면 같은 타입의 자료형 여러개를 생성하지만
객체 생성에서는 클래스에서 정의해놓은 타입의 자료형을 생성한다.
예에서는 string 1개, boolean 1개, int 1개

class Tv
{
String color;
boolean power;
int channel;
}

class Main
{
public static void main(String[] args)
{
Tv t1 = new Tv();
}
}

여기서 t1은 변수가 아니다. 변수는 하나의 값만을 가지는데 t1은 string 1개, boolean 1개, int 1개의 값을
가지고 있다. 따라서 t1에서 해당 변수에 접근하는 주소가 필요하다. 따라서 t1은 주소라고 볼 수 있다.
접근하는 방법은 .(dot)을 통해서 접근한다.(c에서의 포인터의 개념)
이렇게 주소를 가지고 있는 변수를 참조형변수라고 한다.

t1.color
t1.power
t1.channel




선언위치에 따른 변수의 종류



class Tv
{
String color;
boolean power;
int channel;
}

class Main
{
public static void main(String[] args)
{
Tv t1 = new Tv();
Tv t2 = new Tv();
t1.color = "red";
t2.color = "blue";
t1 = t2; //t1과 t2는 같은 타입이기 때문에 대입이 가능하다.
//t1의 주소를 100번지, t2의 주소를 200번지라고 했을때
//t1 = t2이면 t1의 주소도 200번지, t2의 주소도 200번지가 되게 된다.
System.out.println(t1.color);
System.out.println(t2.color);
//따라서 둘다 200번지의 값인 blue를 출력
t1.color = "green";
//여기서 t1의 값을 바꾼것 같지만 사실은 아직도 가르키고 있는 200번지이다.
//이전에 t1이 가리켯던 100번지는 가비지컬랙터에 의해 제거
System.out.println(t1.color);
System.out.println(t2.color);
//따라서 200번지 값이 모두 바뀌어서 둘다 green을 출력함
}
}





인스턴스 변수

객체 생성 후 사용가능

- 각 인스턴스의 개별적인 저장공간, 인스턴스마다 다른 값 저장가능
- 인스턴스 생성 후, 참조변수.인스턴스변수명으로 접근
- 인스턴스를 생성할 떄 생성되고, 참조변수가 없을 떄 가비지컬렉터에 의해 자동 제거

class Main
{
int x=100; //인스턴스 변수임
public static void main(String[] args)
{
Main m = new Main();
//인스턴스 변수는 객체를 생성 후에 사용 할 수 있다.
System.out.println(m.x);
}
}


클래스 변수

- 같은 클래스의 모든 인스턴스들이 공유하는 변수 (클래스가 공통으로 같는)
- 인스턴스 생성없이 클래스 이름.클래스변수명
- 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸

이 변수가 인스턴스 변수인지 클래스 변수인지를 구분할수 있다?
static 으로 선언된 변수가 클래스 변수이다.



class Tv{
static String color; //static이 있으면 클래스 변수
boolean power; //power과 channel은 인스턴스 변수가 된다.
int channel
}

class Main
{
static int x=100; //인스턴스 변수임
public static void main(String[] args)
{
System.out.println(Main.x);
System.out.println(x);//같은 클래스 내에서는 Main생략 가능
System.out.println(Tv.color);
//System.out.println(Tv.power);
//non-ststic에러라고 나옴, power가 인스턴스 변수이기 때문
int x=200;
System.out.println(x);
//클래스 변수와 동일한 지역변수를 갖을수 있다.
//이때는 지역변수를 우선으로 한다.
System.out.println(Main.x);
//클래스 변수를 접근하고자 한다면, Main을 붙힌다.
//생략가능하지만, 생략 안하는것이 좋음.
}
}


================================================




class Tv
{
static String color="red";//static이 있으면 클래스 변수
boolean power;  //power과 channel은 인스턴스 변수가 된다.
int channel;
}

class Main
{
public static void main(String[] args)
{
Tv t1 = new Tv();
Tv t2 = new Tv();
Tv.color = "blue";//공유하는 클래스 변수이기 때문에 모두 변경
System.out.println(t1.color);
System.out.println(t2.color);

t1.color = "green";//Tv.color가 올바른 접근 방식이나 t1.color도 가능
System.out.println(Tv.color);
System.out.println(Tv.color);

Tv t3 = new Tv();
System.out.println(t3.color);
}
}



================================================


class ClassVar
{
public static void main(String[] args)
{
System.out.println(Main2.x);
}
static int x = 100;
//static이 먼저 올라가기 때문에 클래스 어느 위치에서 선언하든지
//상관없다. 단, 이렇게 보기 어렵게는 하지 말자.
}


class Main2
{
int x = a;
static int a = 100;
// 컴파일 될까?
//된다. 왜냐하면 컴파일은 순서대로 되는 것이 아니라
//static이 먼저 올라가기 때문에 x는 a를 사용할수 있다.
}



class Main2
{
int x = 100;
static int a = x;
//반대로 컴파일 될까?
//안된다. 왜냐하면 컴파일은 순서대로 되는 것이 아니라
//static이 먼저 올라가기 때문에 a는 x를 사용할수 없다.
}






인스턴스 변수와 클래스 변수 활용 예제


class Card
{
String kind; //카드의 무늬 - 인스턴스 변수
int number; //카드의 숫자 - 인스턴스 변수
static int width = 100; //카드의 너비 - 클래스 변수
static int height = 250;//카드의 높이 - 클래스 변수
//카드의 무늬와 숫자는 각각 다르지만,
//너비와 높이는 같기 때문에 각각 인스턴스, 클래스 변수로 설정한다.
}

class CardTest
{
public static void main(String[] args)
{
System.out.println("Card.width = " + Card.width);
System.out.println("Card.height = " + Card.height);

Card c1 = new Card();
c1.kind = "Heart";
c1.number = 7;

Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;

System.out.println(c1.kind +" "+ c1.number +" "+ c1.width +" "+ c1.height);
System.out.println(c2.kind +" "+ c2.number +" "+ c2.width +" "+ c2.height);
System.out.println("c1의 width와 height를 각각 50, 80으로 변경합니다.");

c1.width = 50;
c1.height = 80;

System.out.println(c1.kind +" "+ c1.number +" "+ c1.width +" "+ c1.height);
System.out.println(c2.kind +" "+ c2.number +" "+ c2.width +" "+ c2.height);

}
}



참조 타입의 변수는 주소를 가지고 있다.


지역변수

- 메서드 내에 선언되며, 메서드의 종료와 함께 소멸.
- 조건문, 반복문의 블록 내에 선언된 지역 변수는 블록을 벗어나면 소멸.

class LocalVar
{
public static void main(String[] args)
{
for (int i=0;i<3;i++)
{
System.out.println(i);
}
//System.out.println(i);
//i는 지역 변수이기 때문에 for문 내에서만 쓸수 있다.
//블록을 벗어난 지역에서는 소멸되기 때문에 사용 할 수 없음
}
}