-
013. 클래스와 인스턴스( 지역변수, 전역변수, 메소드와 참조변수, 매개변수, default pakage)SsY/Class 2023. 2. 28. 01:01728x90
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'SsY > Class' 카테고리의 다른 글
015. 배열의 선언과 초기화, 배열 중첩 (배열의 배열) (0) 2023.03.03 014. 클래스와 인스턴스 실습, 생성자(Constructor) (0) 2023.03.02 012. 실행 흐름의 컨트롤(제어문) for문 중첩(별 찍기), break, continue, skip,return 실습, 변수와 메소드의 스코프 (0) 2023.02.26 011. 실행 흐름의 컨트롤(반복문) while, do~while, for문 실습 (0) 2023.02.24 010. 실행 흐름의 컨트롤(반복문) while, do~while, for + while문 실습 (1) 2023.02.23 - Test068, 069