/*=====================================
■■■ 클래스와 인스턴스 ■■■
======================================
*/
//직사각형 클래스 설계 → 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
계속하려면 아무 키나 누르십시오 . . .
*/
}
}
'📚Study Note > JAVA' 카테고리의 다른 글
[ JAVA ] 클래스와 인스턴스 ③ 메소드 오버라이딩, 초기화블럭 (0) | 2021.03.14 |
---|---|
[ JAVA ] 클래스와 인스턴스 ② 생성자 (Constructor) (0) | 2021.03.14 |
[ JAVA ] break ; / continue; / return; (0) | 2021.03.13 |
[ JAVA ] for문을 활용해서 구구단출력, 별찍기 (0) | 2021.03.13 |
[ JAVA ] do while문, for문 (0) | 2021.03.13 |