본문 바로가기

📚Study Note/JAVA

[ JAVA ] 클래스와 인스턴스 ①

/*=====================================
	■■■ 클래스와 인스턴스 ■■■
======================================

*/

//직사각형 클래스 설계 → Rect 로 이름 붙이기로

/*
내용(비즈니스 로직) :  직사각형의 넓이와 둘레를 계산하는 클래스로 표현
클래스의 정체성 → 직사각형
클래스의 속성 → 가로 세로 넓이 둘레 무게 색상 재질 이있지만 가로하고 세로만 하기로
클래스의 기능 → 넓이 계산 둘레 계산, 가로/세로 입력, 결과 출력
									------------    --------------
									                 가로 : xxxxxx
								가로 입력:   		 세로 : xxxxxx
								세로 입력:	    	 넓이 : xxxxx
													 둘레 : xxxxx

※ 객체를 구성하는 것 → 데이터(속성 상태) + 기능(행위 동작)
      :                  ----------------    --------------
	  :
클래스 설계  →              변수         +      메소드
*/
import java.util.Scanner;
class Rect //직사각형 클래스 설계
{
   // ○ 변수 선언( 가로/ 세로)
   int w, h;
   // 클래스에서 직접 선언했기 때문에 전역변수이다 클래스 영역안에서 글로벌 활동이 가능한 변수이다
   // 멤버변수라고 부르기도 한다 클래스에 소속되어있는 요소로써의 의미
   // 인스턴스 변수라고 부르기도 한다 - ⓐ 인스턴스가 생성되었을 때 비로소 메모리 할당이 이루어지는 변수
   									 // ⓑ 이 변수에 접근하기 위해서는 생성된 인스턴스를 통해서만 가능하다


	// ○ 메소드 정의 ( 가로 / 세로 입력)
	//	 ⓐ 우선 메소드의 이름을 네이밍룰에 따라서 명명규칙에 따라서 지어준다.
	//	 ⓑ 매개 변수 구성한다
	//	 ⓒ 호출한 지점에 어떤 자료를 두고 오게 하겠다. 즉 반환 자료형을 구성해야 한다.
	//	 ⓓ 메소드 내부 정의
	// ※ void는 메소드 실행 후 메소드를 호출한 곳에 결과를 돌려줄 필요가 없을 때 지정하여 사용하게 되는데
	//    아무것도 돌려주지 않는다고 해서 반환 자료형을 명시하지 않게 되면 문법적인 에러가 발생하게 된다.
	//	  반환 자료형을 명시하지 않는 문법은 생성자에서 선점~!!!!!!!!!!!!!!!!



	void input ()// return; 이렇게 된 경우에도 void타입?? 이건뭔소린지모르겠음 return은 반환자료형이 있다는 건데...→ 아return이 반환이 아니라 메소드 종료 의미할때 그거말하는건가
	{
		
		//Scanner 인스턴스 생성
		Scanner sc = new Scanner(System.in);

		//클래스에서 스캐너 인스턴스를 호출할 수 있나?
		//할 수 있다. 지역변수 위치에 하는것 보다 메소드 안에 해야
		//선택적으로 스캐너 활용할 수 있게 된다. 차라리 지역변수부분에 쓰기보다는 그냥 모든 메소드 안에 스캐너 호출을 하는 것이 더 낫다.
		//그렇다고 메모리 더 안 잡아 먹는다.

		System.out.print("가로 입력 : ");
		w= sc.nextInt();


		System.out.print("세로 입력 : ");
		h= sc.nextInt();



		
	}
	// ○ 메소드 정의 (둘레 계산)
	// 메소드의 실행후 결과가 정수인 경우를 지정하기 위해서 리턴자료형은 int형을 사용하게 된다
	// 사각형의 둘레를 구하는 과정에서 필요한 연산은 『』이며 이들은 모두 정수이기때문이다
	// 또한 넓이와 둘레를 담을변수를 클래스내부에 별도로 선언한 것이 아니기 때문에 연산 결과는 메소드를 호출한 곳에 반환하는 형태로 처리되어야 한다.
	int calLength() //지역변수는 필요없다 그리고 둘레를 받아낼 변수가 없어서 
	{
		return (w + h) *2;
		// ※ 메소드는 return 문을 통해서만 결과를 돌려주게(반환하게) 된다.
	}


	// ○ 메소드 정의 ( 넓이 계산)
	int calArea()
	{
		int result;
		result = w* h;
		return result;


	}
	// ○ 메소드 정의 ( 결과 출력)
	//  매개변수를 통해 데이터를 넘겨받을 수 있도록 정의(갖고있지 않은 데이터)
	// 매개변수 선언 시 각각의 변수마다 자료형을 따로 지정해야 한다. 변수선언할때처럼 int a, b, c; 이거안됨
	void print(int a, int l) //매개변수로 둘레와 넓이 받아야한다

	{
		System.out.println("가로 : " + w);
		System.out.println("세로 : " + h);
		System.out.println("넓이 : " + a);
		System.out.println("둘레 : "+ l);

		
	}
// 그런데 하나의 파일(.java)에 클래스가 여러개 있을 수 있나?있따! 그런데 public 이 붙을 수 있는 클래스는 단하나!!!!
}
//파일을 저장할때는 public class 이름으로 지정해야 하며 구성된 모든 클래스가 public class가 아닐 경우 이들 중
//파일을 대표할 수 있는 클래스를 선택하여 해당 클래스의 이름으로 지정해야 한다. 또한 여러개의 클래스가 설계된 하나의 파일을 컴파알하게 되면
//어차피 컴파일하면 클래스가 5개면 .class파일이 5개 만들어진다..와우

//main() 메소드를 포함하고 있는 외부의 다른 클래스일 뿐이다.
public class Test070
{
	public static void main (String[] args)

	{
		// Rect클래스 기반의 인스턴스 생성
		//---------------------------------
		// 설계도면   →→→→→→
		
		Rect ob = new Rect();
		int a, b; //둘레와 넓이 담을 변수

		ob.input(); //void니까 아무것도 안하고 이렇게만해도 뭔가 나온다.

		a = ob.calLength();

		b = ob.calArea();
		
		ob.print(b,a);

		/*[출력결과]
		가로 입력 : 1
		세로 입력 : 2
		가로 : 1
		세로 : 2
		넓이 : 2
		둘레 : 6
		계속하려면 아무 키나 누르십시오 . . .*/

	}
}

 

 

 

 

/*==========================================
	 ■■■  클래스와 인스턴스 ■■■
 ===========================================*/

// 원의 넓이와 둘레를 구하는 클래스 설계
// 원의 넓이와 둘레를 구할 수 있는 클래스를 독립적으로 (별도로) 생성한다.
// 클래스명 : CircleTest → CircleTest.java
// 원의 넓이 = 반지름 * 반지름 * 3.141592
// 원의 둘레 = 반지름 * 2* 3.141592

// 실행 예) 
// 반지름 입력 : xx
// >> 반지름이 xx인 원의 
// >> 넓이 : xx.xx (소수점 둘째자리)
// >> 둘레 : xx.xx
// 계속하려면 아무키나....

public class Test071
{
	public static void main(String[] args)
	{
		
		double c,d; // c → 원의넓이 d → 원의 둘레 담을 변수를 선언. 
					//CircleTest 클래스에 넓이와 둘레를 담을 멤버변수가 없으므로

		CircleTest ct = new CircleTest();

		ct.inputR();

		c=ct.calArea();
		
		d=ct.calPer();

		ct.print(c,d);

		/*출력결과
		반지름 입력 : 3
		>> 반지름이 3 인 원의
		>> 넓이 : 28.27
		>> 둘레 : 18.85
		계속하려면 아무 키나 누르십시오 . . ..*/


	}
}

 

 

 

//Test71에서 인스턴스 생성해서 테스트해볼 클래스인 CircleTest

import java.util.Scanner;

class CircleTest
{
	int r; //여기서 3.141592를 double pi=3.141592 이렇게 선언 하고 해도됨.
	final double PI = 3.141592; //final : 변수의 상수화


	//반지름 입력시켜야 함 입력만 받는거니까 그냥그냥 void형으로 여기서 반지름을 반환해줄것인가(지역변수로쓰게) 아니면 멤버로? 멤버변수로 하기로함 void
	void inputR()
	{
		Scanner sc = new Scanner(System.in);

		System.out.print("반지름 입력 : "); //만약여기서 BufferedReader 쓰려면 throws IOException 은 inputR() 옆에 다가 써줘야함
		r = sc.nextInt();
	}
	//넓이를 계산해야함 이미 r과 PI가 있으므로 지역변수 받을 필요는 없다. 넓이를 받을 변수는 그냥 지역변수로 하자 더블형 

	double calArea()
	{
		return r*r*PI;
	}
	//둘레를 계산해야함 둘레를 받을 변수는 마찬가지로 지역변수 더블형으로

	double calPer()
	{
		double result;
		result = r*2*PI;
		return result;

	}


	//출력메소드 구현해야 함. 반환하는 게 없으므로 void. 
	//그런데 멤버변수에 넓이와 둘레가 없으므로 지역변수 입력받아야 한다. 
	void print(double a, double b)
	{
		System.out.println(">> 반지름이 " + r + " 인 원의");
		System.out.printf(">> 넓이 : %.2f\n" , a);
		System.out.printf(">> 둘레 : %.2f\n" , b);
		
	}
	
}

 

 

 

 

 

/*==========================================
	■■■  클래스와 인스턴스 ■■■
 -클래스 개념 적용 및 클래스 설계 실습
 ===========================================*/
// 사용자로부터 임의의 정수를 입력받아 1부터 입력받은 수까지의 합을 연산하여 결과를 출력하는 프로그램을 구현한다
// 단. 클래스와 인스턴스의 개념을 활용하여 처리할 수 있도록 하며
// 또한 입력처리과정에서 BufferedReader의 readLine() 을 사용하며
// 입력받은 데이터가 1보다 작거나 1000보다 큰 경우
// 다시 입력받을 수 있는 처리를 포함하여 프로그램을 구성할 수 있도록 한다.


//실행 예)
// 임의의 정수 입력(1 ~ 1000) : 1002
// 임의의 정수 입력(1 ~ 1000) : -20
// 임의의 정수 입력(1 ~ 1000) : 100
// >> 1~ 100 까지의 합 : 5050
// 계속하려면아무키나....
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;


class Hap
{
	int a;	
	//우선 임의의 정수를 입력받는다
	//그것이 1에서 1000인지 확인하고 아니라면 다시 입력하라고 한다

	void input() throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		
		do
		{
			System.out.print("임의의 정수 입력(1 ~ 1000) : ");
		    a = Integer.parseInt(br.readLine());

		}
		while (a<1 || a>1000);
		
	}
	

	// 맞다면 1부터 정수까지의 합을 구한다
	   int calculate()
	   {
		   int result=0;
		   for(int i=1; i<=a; i++)
		   {
			   result +=i;
		   }
		   return result;
	   }
	// 결과값을 출력한다.

	   void print(int sum)
	   {
		System.out.printf(">> 1~ %d 까지의 합 : %d\n", a, sum);
	   }
    

}

public class Test072
{
	public static void main(String[] args) throws IOException
	{

		//Hap 클래스 인스턴스 생성
		Hap hp = new Hap();


		// 생성한 인스턴스를 통해 입력메소드 호출 → throws IOException 처리
		hp.input();


		// 생성한 인스턴스 통해 연산메소드 호출 -> 인트형 결과값 반환 -> 받아낼 수 있는 처리		
		int result = hp.calculate();

		//생성한 인스턴스를 통해 출력 메소드 호출! -> 출력해야 할 지역변수로 누적합의 값 result를 넘겨줌
		hp.print(result);
	
	
	}

}
	/*
	임의의 정수 입력(1 ~ 1000) : -20
	임의의 정수 입력(1 ~ 1000) : -2250
	임의의 정수 입력(1 ~ 1000) : 20
	>> 1~ 20 까지의 합 : 210
	계속하려면 아무 키나 누르십시오 . . .
	*/

 

 

 

 

 

/*==========================================
	■■■  클래스와 인스턴스 ■■■
 ===========================================*/

// 사용자로부터 임의의 두 정수와 연산자를 입력받아 사칙 연산을 수행하는 프로그램을 구현한다.
// 단, 클래스와 인스턴스의 개념을 적용하여 작성할 수 잇도록 한다.

// 실행 예)
// 임의의 두 정수 입력(공백 구분) : 30 15
// 임의의 연산자 입력(+ - * /)    : +
// >> 30 + 15 = 45
// 계속하려면 아무 키나 

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

import java.util.Scanner;
import java.io.IOException;

class Calculate
{
	int su1, su2;
	char op;
	//두 정수를 입력받는다
	void inputInt()
	{
		
		Scanner sc = new Scanner(System.in);
		System.out.print("임의의 두 정수 입력(공백 구분) : ");
		su1= sc.nextInt();
		su2= sc.nextInt();

	}
	//연산자를 입력받는다
	void inputOp() throws IOException
	{
		System.out.print("임의의 연산자 입력(+ - * /)    : ");
		op = (char)System.in.read();
	}
	
		
	//연산을 한다
	int cal()
	{
		int result=0;


		switch (op)
		{
			case '+': result = su1 + su2; break;
	        case '-': result = su1 - su2; break;
			case '*': result = su1 * su2; break;
			case '/': result = su1 / su2; break;
		}
		return result;
		//여기서 이외의 값을 처리하려면 String클래스 공부해야 가능하다.
	}



	//연산결과를 출력한다
	void print(int a)
	{
		System.out.printf(">> %d %c %d = %d\n", su1,op, su2, a);
	}

}


// main() 메소드를 포함하고 있는 외부의 다른 클래스

public class Test073
{
	public static void main(String[] args) throws IOException
	{
		Calculate cl = new Calculate();
		cl.inputInt();
		cl.inputOp();
		
		
		int c; //연산 결과를 담을 변수
		c= cl.cal();
		cl.print(c);

		/*임의의 두 정수 입력(공백 구분) : 3 5
		임의의 연산자 입력(+ - * /)    : *
		>> 3 * 5 = 15
		계속하려면 아무 키나 누르십시오 . . .
		*/
	}
}