ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 013. 클래스와 인스턴스( 지역변수, 전역변수, 메소드와 참조변수, 매개변수, default pakage)
    SsY/Class 2023. 2. 28. 01:01
    728x90

    2023.02.10 (금)

    클래스와 인스턴스
    ※ 클래스(틀) 을 기반으로 객체(인스턴스) 생성하기!

    참조변수와 메소드의 관계확인
    (인스턴스 변수/메소드로 불리는 이유?)
    1. 변수던, 메소드던  인스턴스 생성시점에 메모리 할당받아 태어나게 된다
    2. 사용(접근)하는 과정이 br.readLine(); 이와 같이 인스턴스를 통해서 이루어지기 때문에 

    ※ 참조변수의 null(널) 초기화
    - null은 참조변수 안에서 아무것도 참조하지 않음을 의미 (비워진 값으로 채워져있다)

    • Test068, 069
      - 068 : 지역변수의 초기화 테스트
      - 069 : 전역변수의 초기화 테스트
    더보기

    * ob  :  object 의 약자로 사용된다.

    /*=============================================
    	 ■■■ 지역변수와 전역변수 ■■■
    	 - 지역변수의 초기화 테스트
    ==============================================*/
    
    // Test069.java와 비교!
    
    // ※ 지역 변수는 초기화 과정을 거치지 않으면 사용할 수 없다.
    //		(→ 자바가 자동으로 초기화를 수행 해주거나 하지 않는다.)
    
    public class Test068
    {
    	// 클래스의 영역
    
    	// 변수 선언 → 클래스 전체 영역에서 접근 가능 → 전역 변수
    
    	public static void main(String[] args)
    	{
    		// 메소드의 영역
    
    		// 변수 선언 → 이 메소드 영역에서만 접근 가능 → 지역 변수
    
    		// 지역 변수 n
    		int n;
    		//-- 선언 후 초기화 과정을 거치지 않은 상태
    
    		System.out.println("n : " + n);
    		//--==>> 에러 발생 (컴파일 에러)
    		//		 variable n might not have been initialized
    		//-- 지역 변수 n 에 접근하여 그 값을 출력하고자 하는 구문
    		
    	}
    
    	// 다른 메소드 정의()
    	//{
    	//}
    
    	// 또 다른 메소드 정의()
    	//{
    	//}
    
    	//		:
    }
    /*=============================================
    	 ■■■ 지역변수와 전역변수 ■■■
    	 - 전역변수의 초기화 테스트
    ==============================================*/
    
    // Test068.java와 비교!
    
    public class Test069
    {
    	// 클래스의 영역
    
    	// 전역 변수 a 선언
    	int a;
    	//-- 자동으로 0 으로 초기화 지원
    	boolean b;
    	//-- 자동으로 false로 초기화 지원
    	char c;
    	//-- 자동으로 ' '(공백)으로 초기화 지원
    	double d;
        //-- 자동으로 0.0 으로 초기화 지원
    
    	public static void main(String[] args)
    	{
    		// 메소드의 영역
    
    		// System.our.println("a : " + a);
    		//--==>> 에러 발생 (컴파일 에러)
    		//		 non-static variable a cannot be referenced from a static context
    		
    		// Test069 클래스 기반으로 인스턴스 생성
    		Test069 ob = new Test069();
    
    		System.out.println("ob.a : " + ob.a);
    		//--==>> ob.a : 0
    
    		System.out.println("ob.b : " + ob.b);
    		System.out.println("ob.c : " + ob.c);
    		System.out.println("ob.d : " + ob.d);
    		//--==>>
    				/*
    				ob.b : false
    				ob.c :
    				ob.d : 0.0
    				*/
    	}
    }

    • Test070
    // ※ 하나의 자바 파일(.java)에 여러 개의 클래스(class)를 설계할 수 있다.
    //   하지만, 『public class』는 이 파일 내에서 하나만 올 수 있다.
    //   파일을 저장할 때의 이름은
    //   이 『public class』의 이름으로 지정해야 한다.
    //   일반적으로(실무적으로는) 하나의 파일에 하나의 클래스를 설계한다.
    //   또한, 여러 개의 클래스가 설계된 파일을 컴파일하게 되면,
    //   내부에 설계된 클래스의 수 만큼 클래스 파일(.class)이 파생된다.

    // import.. // 같은 파일 내에 존재하기때문에 default 
    더보기
    /*=============================================
    	 ■■■ 클래스와 인스턴스 ■■■
    	 - 직사각형 클래스 설계 실습
    ==============================================*/
    
    /*
    직사각형의 넓이와 둘레 계산 → 클래스로 표현
    
    클래스의 정체성 → 직사각형의 설계도
    클래스의 속성   → 가로, 세로	        (, 넓이, 둘레, 부피, 무게, 재질, 색깔, ... ... .)
    클래스의 기능   → 넓이 계산, 둘레 계산, 가로 세로 입력, 결과 출력      (, 무게 측정, ... ... .)
    
    객체를 구성      → 데이터(속성, 상태) + 기능(동작, 행위)
        ↓                      ↓                   ↓
    클래스 설계      →        변수      +      메소드
    
    class 직사각형
    {
    	// 데이터(속성, 상태) → 변수 (순서 의미 없음)
    	//int 가로, 세로, 넓이, 둘레;
        int 가로, 세로;
    
    	// 기능(동작, 행위)	  → 메소드 (순서 의미 없음) check
    	가로세로 입력(){}
    	둘레 계산(){}
    	넓이 계산(){}
    	결과 출력(){}
    }
    */
    
    import java.util.Scanner;
    
    class Rect													// 직사각형 클래스 설계
    {
    	// 데이터(속성, 상태) → 변수 (순서 의미 없음)
    	//int 가로, 세로, 넓이, 둘레;
    	int w, h;											    //int 가로, 세로;
    
    
    	// 기능(동작, 행위)	  → 메소드 (순서 의미 없음) check
    
    	void input()											//가로세로 입력()
    	{
    		//Scanner 인스턴스 생성
    		Scanner sc = new Scanner(System.in);
    
    		System.out.print("가로 입력 : ");
    		w = sc.nextInt();
    
    		System.out.print("세로 입력 : ");
    		h = sc.nextInt();
    	}
    	
    	int	calLength()												//둘레 계산() → (가로 + 세로) * 2
    	{
    		/*
    		int result;
    
    		result = (w + h) * 2;
    
    		return result;
    		*/
    		return (w + h) * 2;
    	}
    
    	int calArea()												//넓이 계산() → 가로 * 세로
    	{
    		//주요 변수 선언
    		int result;
    
    		//연산 및 처리 → 선언한 변수들에 값 담아내기
    		result = w * h;
    		
    		// 최종 결과 반환 
    		return result;
    	}
    
    	void print(int a, int l)										// 결과 출력() → 가로 : xx, 세로 : xx, 넓이 : xx, 둘레 : xx
    	{
    		// 가로 : 10
    		// 세로 : 20
    		// 넓이 : 200
    		// 둘레 : 60
    		System.out.println("가로 : " + w);
    		System.out.println("세로 : " + h);
    		System.out.println("넓이 : " + a);
    		System.out.println("둘레 : " + l);
    	}
    
    }
    
    public class Test070
    {
    	public static void main(String[] args)
    	{
    		//Rect 클래스 기반 인스턴스 생성
    		Rect ob = new Rect();
    
    		//		▼
    		
    		//			-------- 공간 채움
    		//Rect ob = new Rect;
    		//--------		+
    		//공간확보		Rect();
    		//				------ 호출
    
    		// 입력 메소드 호출
    		ob.input();
    
    		// 넓이 연산 메소드 호출
    		int area = ob.calArea();
    		
    		// 둘레 연산 메소드 호출
    		int length = ob.calLength();
    
    		// 출력 메소드 호출
    		ob.print(area, length);
    
    	}
    }
    
    // 실행 결과
    
    /*
    가로 입력 : 10
    세로 입력 : 20
    가로 : 10
    세로 : 20
    넓이 : 200
    둘레 : 60
    계속하려면 아무 키나 누르십시오 . . .
    */
    ※ 메소드의 이름 결정(가급적 동사형태)
        → 메소드 안에 넣어줄 인수 생각 
              * 매개변수는  (int a, int b)----(O)
                                      (int a,b)--------(X)
        → 메소드를 부른 지점에 어떤 값을 둘 것인가(반환할 값의 형태)
        (순서는 상관은없기에 생각이 잘 나지 않으면 역으로 구성하기!)

    • Test071
      - 클래스와 인스턴스
    더보기
    /*=============================================
    	 ■■■ 클래스와 인스턴스 ■■■
    ==============================================*/
    
    // ※ CircleTest.java 파일과 한 세트
    
    // 원의 넓이와 둘레 구하기
    // 원의 넓이와 둘레를 구할 수 있는 클래스를 설계한다.
    // ( 클래스명 : CircleTest) → CircleTest.java
    // 데이터를 입력받아 처리하는 과정에서
    // BufferedReader 의 readLine() 을 사용한다.
    
    // 원의 넓이 = 반지름 * 반지름 * 3.141592
    // 원의 둘레 = 반지름 * 2 * 3.141592
    
    // 실행 예)
    // 반지름 입력 : xxx
    
    // >> 반지름 이 xxx 인 원의
    // >> 넓이 : xxx.xx
    // >> 둘레 : xxx.xx
    // 계속하려면 아무 키나 누르세요...
    
    import java.io.IOException;
    // import ........CircleTest;
    // pakage default;
    
    public class Test071
    {
    	public static void main(String[] args) throws IOException
                                             //--------------------
                                             //  예외처리! Circle Test 에서 throws IOException 처리한 구문을 main으로 불러왔기 때문에
    	{
    		// CircleTest 클래스 기반 인스턴스 생성
    		// = CircleTest 인스턴스 생성
    		// = CircleTest 객체 생성
    
    		CircleTest ob = new CircleTest();
    
    		// 입력 메소드 호출
    		ob.input();
    		
    		// 넓이 계산 메소드 호출하여 반환 값을 변수에 담아내기
    		double num1 = ob.calArea();
    
    		// 둘레 계산 메소드 호출하여 반환 값을 변수에 담아내기
    		double num2 = ob.calLength();
    
    		// 결과 출력 메소드 호출
    		ob.print(num1, num2);
    	}
    }
    
    // 실행 결과
    
    /*
    반지름 입력 : 36
    >> 반지름이 36 인 원의
    >> 넓이 : 4071.50
    >> 둘레 : 226.19
    계속하려면 아무 키나 누르십시오 . . .
    */
    /*
    class 원
    {
    	// 데이터(속성, 상태) → 변수 (순서 의미 없음)
        int 반지름;
    	double 원주율;
    
    	반지름 입력(){}
    	둘레 계산(){}
    	넓이 계산(){}
    	결과 출력(){}
    }
    */
    
    // pakage default;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.IOException;
    
    // import java.lang.*;	
    // import 구문을 작성하지 않을 때 기본적으로 들어가는 구문 ex) System , Integer, String, Object ... .
    
    public class CircleTest 
    {
    	// 반지름 입력 기능 → 메소드 정의
    	void input() throws IOException
    	{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		System.out.print("반지름 입력 : ");
    		r = Integer.parseInt(br.readLine());
    	}
    
    	// 넓이 계산 기능 → 메소드 정의
    	double calArea()
    	{
    		// 원의 넓이 = 반지름 * 반지름 * 3.141592
    		return r * r * PI;
    	}
    
    	// 둘레 계산 기능 → 메소드 정의
    	double calLength()
    	{
    		// 원의 둘레 = 반지름 * 2 * 3.141592
    		double result;
    		result = r * 2 * PI;
    		return result;
    	}
    
    	// 결과 출력 기능 → 메소드 정의
    	//	print(넓이, 둘레)
    	void print(double a, double l)
    	{
    		// >> 반지름 이 xxx 인 원의
    		// >> 넓이 : xxx.xx
    		// >> 둘레 : xxx.xx
    		System.out.printf(">> 반지름이 %d 인 원의 \n", r);
    		System.out.printf(">> 넓이 : %.2f\n", a);
    		System.out.printf(">> 둘레 : %.2f\n", l);
    	}
    }

    • 별도의 java 파일로 구성되어 있는 class 를 import 없이 가져와서 사용할 수 있는 이유?
    ※ pakage(패키지) :
       1) 운영체제 상에서 물리적인 구조 (탐색기 상에서) 디렉토리(폴더)의 위치를 표시
       2) pakage A.B; << 자바가 모든 디렉토리를 확인하지 않아도 구조를 파악하여 찾을 수 있게 해주는 것
                                    논리적인 전달이라고 함.
    // pakage default;            << 사용자가 입력하지 않으면 기본적으로 명시된다고 함.

    // 이 때, 클래스 파일이 같은 디렉토리 내에 있을 경우 pakage default;의 논리적 전달 구조가 같으므로
       import 구문을 별도로 명시하지 않아도 다른 클래스의 메소드를 호출해올 수 있다.


    // pakage default;
    ==> 물리적 & 논리적으로 같은 패키지에 있어서 입력이 필요가 없다.
    728x90
Designed by planet-si