정리 노트/쌍용 KDT_(자바 Spring)

23.02.10(금): 지역변수와 전역변수, 클래스와 인스턴스, null, classpath와 package

우주바다 2023. 5. 30. 18:29
728x90

오늘 배운 내용
01. 지역변수, 전역변수 
02. 클래스와 인스턴스

+) 

null

classpath와 package



01.  지역변수, 전역변수 (68,69)

전역 변수 (Global Variable) :

클래스 영역에서 선언된 변수. (주의: 클래스 변수와는 완전히 다른 개념)

지역 변수 (Local Variable) :

메소드 영역에서 선언된 변수. 초기화 필수.

 

변수는 사용되는 위치보다 선언  위치가  중요하다. 
선언 지역을 벗어나면 보이지 않는 상태가 된다.

지역변수, 전역변수


02.  클래스와 인스턴스

( 이론 + 70, 71 + CircleTest , 72)

 

* 객체지향 프로그래밍
: 객체를 주인공으로 구성(지향)
cf. 함수 지향, 절차 지향 ..

객체(Object) : 사전적으로는 물건, 대상.

"나는 과일가게에서 두 개의 사과를 구매했다."
---     -----------        ------    -----     -----------
객체    객체              데이터    객체      행위 기능


객체를 구성하는 것은 데이터와 기능이다.

클래스라는 틀 기반 안에서 객체 생성.
클래스는 어떤 실체가 아닌 일종의 틀.

객체의 설계도 또는 찍어내는 틀.

ex) 
보드마카 설계도 : 클래스
찍어낸 마카 1,2,3.... : 객체 1,2,3...

ex) 인스턴스 던전
같은 던전 (클래스) 위에 
투명 레이어가 깔리고 입장~! (메모리에 실체화 == 인스턴스 생성)
던전 들어가는 로딩~ (==클래스를 메모리로 가져오는 중..)
레이어마다 별개로 플레이. ( 따로 입장한 팀은 서로를 볼 수 없다 == 스코프)

참조 변수와 인스턴스
BufferedReader br = new BufferedReader();

FruitSeller seller = new FruitSeller();
--------------  ------      ---------------
클래스   참조변수명     인스턴스 


// 객체 지향 프로그래밍을 왜 지향하는가? 
계산 메소드 2개를 모두 없애고 print()에서 w,h 에 접근해서 출력할 수 있지만 그러지 않는건..
사람 기준이 아닌 프로그램 기준으로 설계하기 때문 (각각 역할에만 집중할 수 있고, 분리되어서 유지보수에 유리.)
한 부분이 망가지면 기능별로 작성되었기 때문에 오류를 찾고 고치기 쉽다.

 

실습 070

import java.util.Scanner;
class Rect
{
	int w, h ; //가로 세로
 
	void input() // 입력 담당 '메소드의 선언부'! 반환값이 없으므로 void, 
	{			 // 클래스 영역에서 이미 전역변수로 선언했으므로  매개변수가 없어도 된다.
		Scanner sc = new Scanner(System.in); 
		System.out.print("가로 입력: ");
		w = sc.nextInt(); 
		System.out.print("세로 입력: ");
		h = sc.nextInt(); // 전역 변수가 int형이므로 nextInt   
		// 입력값이 전역변수로 담김(접근가능하므로)(별도 return 필요없음) 
	}
	int calLength() 
	{// 메소드 선언부의 자료형은 반환 값이 결정 되었을 때 작성해도 된다. 편한 방식으로~
	 
		/* int result;  
		result = (w + h ) * 2; 
		return result; // 결과 값 반환(int형) */	
		return  (w + h) * 2; //위 3줄의 코드를 아래처럼 작성할 수 있고	
        //(상황에 따라 선택하는데,
        // 변수에 담아야 접근 뿐 아니라, 다른 스코프에서의 재사용이 가능함.)
	}
	int calArea()
	{
	    /*int result;
		result = w * h;
		return result; */
		return (w * h);
	}								
    // (int a, l) 이런식으로 생략이 불가능. 매개변수는 각각자료형 명시해야함.  
	void print(int a, int l)   
	{	//a,l은 이 메소드 내에서만 쓸 변수명! 	
		System.out.println("가로: " + w );
		System.out.println("세로: " + h );
		System.out.println("넓이: " + a ); 
		System.out.println("둘레: " + l );	
	}//int형의 매개변수와 함께 print()가 호출되면  a 자리와
}    // l의 자리에 대입되고 출력된다!

public class Test070
{
	public static void main(String[] args)
	{
		//Rect 클래스 기반 인스턴스 생성 
		Rect ob = new Rect(); 
        // Rect ob = new Rect; + Rect ob = new Rect();  두 문장이 축약된 것.	
		// ob라는 이름으로 선언 및 초기화하면서 동시에 메소드 호출. 
		
		ob.input(); // 입력 메소드 호출 
		
		// 넓이, 둘레 계산 메소드 호출 , 변수에 담기 
		int area = ob.calArea();      // 출력 메소드 호출 시, 매개변수를
		int length = ob.calLength(); // 스코프 내에서 찾아야하므로 따로 변수로 선언.
		
		// 출력 메소드 호출  : print()는 int형 매개변수만 2개 받으면 됨. 
		ob.print(area, length); // 위에서 계산 메소드 호출로 담긴 값을 매개변수로 사용했다.
	}
}

하나의 java 파일 안에 여러 개 class를 설계할 때
public이 붙은 class는 단 하나만 존재해야하고, 그 클래스 명과 파일명이 동일해야 한다.
일반적으로 실무에서는 하나의 파일에는 하나의 클래스만 설계한다. 
(여러 클래스가 있는 자바파일을 컴파일하면 그 수만큼 .class 파일이 생성된다.)


실습 071 + CircleTest

CircleTest 라는 별도 클래스에서 메소드 정의 후, 071 파일에서 호출 

 

CircleTest

더보기

CircleTest (원의 넓이, 둘레 구하기) 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class CircleTest 
{	
	// 전역변수 선언 
	double r;					  // 반지름
	final double PI = 3.141592;   // 원주율

	 /*---------- 입력 메소드 ------------*/ 
	void input() throws IOException // 예외처리
	{	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		System.out.print("반지름 입력:");	
		r = Double.parseDouble(br.readLine()); //예제는 int였는데 double로 해봤다! 	
	}
	 /*---------- 넓이 계산 메소드 ------------*/ 
	double calArea() 
	{
		return (r * r * PI);
	} 
	 /*---------- 길이 계산 메소드 ------------*/ 
	double calLength() 
	{
		return (2 * r * PI);
	}
	 /*---------- 출력 메소드 ------------*/ 
	void print(double a, double l) 
	{	
		System.out.printf(">> 반지름이 %.2f 인 원의\n", r);
		System.out.printf(">> 넓이는: %.2f\n" , a);
		System.out.printf(">> 둘레는: %.2f\n" , l);
	}
}

 

실습 071 

import java.io.IOException;
public class Test071
{	
	public static void main(String[] args) throws IOException //메인 메소드 
	{	
		CircleTest ci = new CircleTest(); // CircleTest클래스 기반의 인스턴스 ci 선언 및 호출		
		ci.input();  // 입력 메소드 호출  

		// 넓이, 둘레 계산 메소드 호출 , 변수에 담기 
		double area = ci.calArea();
		double length = ci.calLength();

		// 출력 메소드 호출
		ci.print(area, length); 
	}
}

 질문했던거

: 클래스에 public 안붙여도 실행되는 이유?
 
강사님 답변

:   public은 접근 제어자로,

하나의 파일 안에 '클래스가 여러 개일때만' 하나 이상 필수로 존재해야 하는 것.

이 경우, 그 클래스 명과 파일의 이름이 같아야한다! 
지금은 클래스가 하나라서 없어도 괜찮다. 자세한건 다음에 배울 예정~

 cf. main 메소드는

런처로 실행할 때, 필수로 하나 있어야 하고 main이 메소드의 이름이다.

public class Test___{ //클래스 
	public staic void main(String[] args) //메인메소드 
	{

	}
}

실습 072

입력값 n -> 1부터 n까지 누적합 출력

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

class Hap 
{	
	int n ; // 사용자 입력 값
	int sum; // 합계 

	void input() throws IOException   // 입력 메소드 
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
		do 
		{	System.out.print(">> 임의의 정수 입력(1 ~ 1000) : ");
			n = Integer.parseInt(br.readLine());  //n에 입력값을 담는다. 
		}while(1 > n || n > 1000);		
	}

	int sum()  // 누적합 처리 메소드 
	{
		for (int i = 1; i <= n ; i++)
		{
			sum += i;
		}
		return sum;
	}
	void print() // 출력 메소드 
	{
		System.out.printf("1부터 %d 까지의 합: %d\n", n, sum);
	}
}
public class Test072 // 메인 메소드 
{		
	public static void main(String[] args) throws IOException
	{
		Hap h = new Hap(); // 인스턴스 호출 
		h.input();  // 입력 메소드 호출 	
		int result = h.sum();// 누적합 메소드 호출
		h.print(); // 출력 메소드 호출 
	}
}

/* ---------- 실행 결과 ---------------
>> 임의의 정수 입력(1 ~ 1000) : 1050
>> 임의의 정수 입력(1 ~ 1000) : -45
>> 임의의 정수 입력(1 ~ 1000) : 100
1부터 100 까지의 합: 5050
계속하려면 아무 키나 누르십시오 . . .
-------------------------------------*/

+) null과 자동 초기화 값 

: 동서양 문화차이.
동양:  빈 공간. 없는건 없는 것..
서양. 빈공간은 빈 상태가 채워진것.
빈 상태를 표현! 해야 빈 거다!   그걸 null이라고 하자~ 

 

+) classpath 와 package

: 같은 package 안에 있는 파일끼리는 import하지 않아도 된다. 
환경변수의 path경로처럼..
classpath 라는게 있다. (class 파일을 실행할 때 위치를 찾는 경로) 

원래 java 파일의 최상단에는
package 정보를 명시해야하는데, 생략하는 경우 눈에보이진 않지만 
package default;  라고 입력한 것과 같다.(자바가 자동으로 생성)


728x90
반응형