오늘 배운 내용
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; 라고 입력한 것과 같다.(자바가 자동으로 생성)
'정리 노트 > 쌍용 KDT_(자바 Spring)' 카테고리의 다른 글
23.02.14(화): 배열 기초, 배열의 배열(다차원 배열) (0) | 2023.06.26 |
---|---|
23.02.13(월): 생성자(Constructor), 초기화 블록, 메서드 오버로딩, 배열 (0) | 2023.06.07 |
23.02.09(목): 반복문 (별 찍기,break, continue), return, 메소드의 재귀 호출 (0) | 2023.03.26 |
23.02.08(수): 반복문 (while, do-while, for) + 다중 for문 (0) | 2023.02.27 |
23.02.07(화): 반복문 while / prefix, postfix(증감연산자) (0) | 2023.02.25 |