관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch6 - 9 ~ 13[클래스의 정의,선언위치변수종류,클래스변수,인스턴스변수] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch6 - 9 ~ 13[클래스의 정의,선언위치변수종류,클래스변수,인스턴스변수]

소소한나구리 2023. 11. 15. 14:34

1) 클래스의 정의

  • 설계도
  • 데이터 + 함수
  • 사용자 정의 타입 - 원하는 타입(클래스)을 직접 만들 수 있음

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

2. 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간

3. 구조체 : 서로 관련된 여러 데이터(종류에 상관없이)를 하나로 저장할 수 있는 공간(C언어에 있음)

4. 클래스 : 서로 관련된 데이터와 함수의 결합(구조체 + 함수)

 

 

(1) 시간을 다루는 타입을 만든다는 가정의 예제

  • 비 객체지향적인 코드 예시
  • 변수 선언이 굉장히 많음
//시, 분, 초 3가지의 값을 저장하기위해 변수 선언
int hour;
int minute;
int second;

// 3개의 시간을 다루기 위해 9개의 변수 선언 -> 처음보다 복잡해짐
int hour1,hour2,hour3;
int minute1,minute2,minute3;
int second1,second2,second3;

// 더 많은 시간을 다루기 위해 배열을 선언
// 시간은 시,분,초를 같이 묶어야 하는데 아래의 배열은 시간끼리,분끼리,초끼리 묶여있는 문제 발생
int[] hour = new int[4];
int[] minute = new int[4];
int[] second = new int[4];
  • 객체지향 적인 코드로 위의 문제를 해결 -> 코드가 간결해지고 시,분,초를 하나의 클래스로 선언하여 객체를 생성하여 시, 분, 초를 사용
  • 객체를 생성하여 참조 변수에 할당하면 되기 때문에 변수 선언이 눈에띄게 줄어듦
  • 다뤄야 할 시간이 많아지면 많아질수록 객체지향적인 코드의 장점이 빛을 발휘함
// 시,분,초라는 변수를 묶어서 Time이라는 클래스(사용자정의타입)를 정의(선언)
class Time {
	int hour;
	int minute;
	int second;
}

// 3개의 변수 선언을 아래 처럼 하나의 객체를 생선하는 것으로 변경
// Time = 시,분,초 3개의 변수를 하나로 묶은 것이기 때문에 기존 코드와 거의 동일한 코드가 됨
Time t = new Time();

// 9개의 복잡한 변수 선언을 아래처럼 간단히 변경
// 타임 객체를 3개 만듦
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();

// 배열을 객체의 배열로 변경
// 시,분,초가 따로 묶이는 것이 아닌 시,분,초가 하나로 묶인 배열이 탄생
Time[] t = new Time[4];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();
t[3] = new Time();

 

(2) 객체지향적인 코드

  • 왼쪽 코드나 오른쪽 코드나 3개의 저장공간이 있다는 점은 같지만 오른쪽이 객체지향적인 코드
  • 자바와 같은 객체지향언어에서는 오른쪽 처럼 객체지향적으로 코드를 작성하는것이 좋은데 유지보수 용이성, 코드의 가독성, 높은 응집도 등 다양한 장점을 활용할 수 있음


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

  • 2개의 영역과 3개의 변수 종류
  • 클래스 내부에서 메서드 영역 외의 영역은 클래스 영역이라고 보면 됨
  • 선언문의 순서는 상관 없지만 일반적으로 변수를 먼저 선언하고 메서드를 작성함

(1) 클래스영역

  • iv (instance variable; 인스턴스 변수)
    • 인스턴스가 생성 되었을 때 생성(객체 생성)
    • 객체 = iv를 묶어 놓은 것
    • 객체를 꼭 생성 해야 사용할 수 있음
  • cv (class variable; 클래스변수, 스태틱변수, 공유 변수) = static + iv
    • 클래스가 메모리에 올라갈 때 생성(클래스가 필요할 때)
    • 자동으로 만들어지므로 객체 생성을 하지 않아도 되며 아무 때나 사용 가능 하며 모든 인스턴스가 공유하는 변수라고 이해하면 됨
    • iv변수에 static이 붙으면 cv
  • 클래스 영역에는 선언문만 가능(일반 문장들은 들어갈 수 없음)

(2) 메서드 영역

  • lv (local variable; 지역 변수)
  • 변수 선언문이 수행 되었을 때 생성되고 메서드가 끝나면 자동으로 제거됨
  • 메서드 정의시 입력하는 파라미터(매개변수)도 지역 변수의 일종임
  • 해당 메서드 영역 안에서만 사용가능한 변수

class variables
{ // 클래스영역의 시작
	int iv;		// 인스턴스 변수
	static int cv;	// 클래스 변수(static 변수, 공유변수)
    
	void method()
    {	// 메서드영역의 시작
	int lv = 0;
    }	// 메서드영역의 끝
} // 클래스영역의 끝

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

(1) 인스턴스 변수

  • 객체의 속성 중 개별적인 속성
  • 각 객체마다 생성 되므로 객체마다 데이터가 다름
  • 인스턴스 변수는 참조변수를 통해 사용함

(2) 클래스(스태틱) 변수

  • 객체의 속성 중 공통적인 속성
  • 공유 하는 것이기 때문에 따로 1개만 생성함
  • 메모리 공간을 절약할 수 있음
  • 클래스변수는 클래스명을 통해 사용함
class Card {
    // 개별 iv
    String kind;	// 무늬
    int number;		// 숫자
    
    // 공통 cv
    static int width = 100;	// 폭
    static int height = 100;	// 높이
}

// 클래스를 사용하는 방법
Card c = new Card();	// 객체 생성

// iv 객체 사용 (참조변수.iv)
c.kind = "HEART";
c.number = 5;

// cv 객체 사용 -> 에러가 안나지만 가급적 아래의 원래 사용방법으로 사용 권장
c.width = 200;
c.height = 300;

// cv 사용의 원래 방법 (클래스이름.cv) -> iv와 혼동할 수 있음
Card.width = 200;
Card.width = 300;

 

** github 에서 다운 받은 플래시(MemberVar.exe) 보고 이해하기 
 ->  코드를 보고 코드가 작동하는 구성을 그리면서 이해

 

(3) 실습

class ex6_3 {
	public static void main(String args[]) {
		// 객체 생성 없이 바로 cv는 사용 가능
		System.out.println("Card.width = " + Card.width);
		System.out.println("Card.height = " + Card.height);
		System.out.println();
		
		// iv 사용 = 객체 생성 후 사용
		Card c1 = new Card();
		c1.kind = "heart";
		c1.number = 7;
		
		Card c2 = new Card();
		c2.kind = "Spade";
		c2.number = 4;

		System.out.println("c1은 "+ c1.kind + ","
        			+c1.number+"이며, 크기는("+Card.width+","+Card.height+")");
		System.out.println("c2은 "+ c2.kind + ","
        			+c2.number+"이며, 크기는("+Card.width+","+Card.height+")");
		System.out.println();
        
		// c1.width로 사용해도 되지만, iv로 헷갈릴 수 있기 때문에 Card.width로 작성
		Card.width = 50;	
		Card.height = 50;	// 위와 동일
        
		System.out.println("c1은 "+ c1.kind + ","
        			+c1.number+"이며, 크기는("+Card.width+","+Card.height+")");
		System.out.println("c2은 "+ c2.kind + ","
        			+c2.number+"이며, 크기는("+Card.width+","+Card.height+")");
	}
	
}
// Card 클래스(변수 작성)
class Card {
	String kind;	//iv
	int number;	//iv
    
	static int width = 100;	//cv
	static int height = 250; // cv
}

 

** 출처 : 남궁성의 정석코딩_자바의정석