1. 복습
1) 자바의 구성요소: 클래스, 메서드, 변수
2) 클래스의 구성요소: 메서드, 변수
3) 클래스는 '사용자 정의 데이터 타입' 이다.
4) 구조
1 2 3 4 | class Person { int age; String name; } | cs |
1 2 3 4 5 | int num = 10; Person hgd = new Person(); hgd.age = 14; hgd.name = "홍길동"; | cs |
2. 변수의 종류
* 앞에 무엇이 붙느냐(static)에 따라 변수명이 다르다.
1) 클래스 변수 (static 변수, 공용 변수, 파란색 이탤릭체)
- 선언 위치: 클래스 내에 선언
- 초기값: 있음
- 사용법: 클래스명.변수명;
- 모든 인스턴스가 공통적으로 같은 값을 유지해야할 경우에는 클래스 변수를 사용한다.
2) 인스턴스 변수 (non-static 변수, 파란색)
- 선언 위치: 클래스 내에 선언
- 초기값: 있음
- 사용법: 클래스를 사용한 인스턴스 생성 > 인스턴스명.변수명;
- 인스턴스마다 각각의 다른 값을 유지해야할 경우에는 인스턴스 변수를 사용한다.
> 클래스와 인스턴스 변수는 초기화를 하지 않아도 사용 가능하다.
3) 지역 변수 (갈색)
- 선언 위치: 메서드 내에 선언, 제어문 내에 선언
- 초기값: 없음
: 가급적 선언과 동시에 초기화 해줄 것을 권장한다.
ex. int a = 0; double a = 0.0; String a = "";
- 사용법: 변수명;
> 지역 변수는 초기화를 하지 않으면 오류는 나지 않지만 사용할 수는 없다.
# 클래스 변수, 인스턴스 변수, 지역 변수 (1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package classex; public class ClassTest03 { // 클래스, 인스턴스 변수는 초기화를 하지 않아도 사용 가능 static int num1; // 클래스(static)변수 int num2; // 인스턴스(non-static)변수 public static void main(String[] args) { // 0. 인스턴스화 시키기 ClassTest03 c1 = new ClassTest03(); // 1. 클래스 변수 System.out.println("클래스 변수: " + num1); System.out.println("클래스 변수: " + c1.num1); System.out.println("클래스 변수: " + ClassTest03.num1); // 권장! // 2. 인스턴스 변수 // System.out.println("인스턴스 변수: " + num2); // 오류 // System.out.println("인스턴스 변수: " + ClassTest03.num2); // 오류 System.out.println("인스턴스 변수: " + c1.num2); // 3. 지역 변수 int num1 = 10; System.out.println("지역 변수: " + num1); int num2; // System.out.println(num2); // 초기화 오류 for (int i=0; i<5; i++) { int num3 = 5; } } } | cs |
# 실행 결과
# 설명
Line 6~7: 클래스 변수, 인스턴스 변수는 초기화하지 않아도 사용 가능하다.
Line 28~29: 그러나 지역 변수는 초기화하지 않고 사용할 수 없다.
Line 15~17: 클래스 변수를 사용하고자 할 때,
변수명 앞에 클래스명을 붙이는 것을 권장하는데 이는 다른 개발자와 협업을 하는 상황에서 오해가 생기지 않게 예방할 수 있기 때문이다.
Line 12: 인스턴스 변수를 사용하고자 할 때, 반드시 클래스를 이용하여 인스턴스화를 시켜 생성해야한다.
Line 20~21: 인스턴스 변수는 인스턴스화 시킨 객체를 통해서만 호출할 수 있다.
Line 22: 인스턴스화 시킨 c1 객체를 통하여 num2를 호출하였다.
Line 31~33: 지역변수는 제어문 블록 내 또는 메소드 안에서 선언할 수 있다.
# 클래스 변수, 인스턴스 변수, 지역 변수 (2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package classex; class Test { static int num1 = 1; int num2 = 2; // 3. 지역 변수 void test() { int num3 = 10; } } public class ClassTest03_3 { static int num1; // 클래스(static)변수 int num2; // 인스턴스(non-static)변수 public static void main(String[] args) { // 0. 인스턴스화 시키기 ClassTest03_3 c1 = new ClassTest03_3(); Test t1 = new Test(); // 1. 클래스 변수 // 클래스 안에 있는 변수는 클래스명을 따로 쓰지 않아도 사용 가능하지만 // 다른 클래스 안에 있는 변수는 반드시 클래스명을 써줘야한다. System.out.println("클래스 변수 num1: " + num1); System.out.println("클래스 변수 num1: " + ClassTest03_3.num1); System.out.println("클래스 Test 변수 num1: " + t1.num1); System.out.println("클래스 Test 변수 num1: " + Test.num1); System.out.println(); // 2. 인스턴스 변수 System.out.println("인스턴스 변수 num2: " + c1.num2); System.out.println("인스턴스 Test 변수 num2: " + t1.num2); } } | cs |
# 실행 결과
# 설명
Line 9~10: 지역 변수는 메소드 내에서 선언 가능하다.
Line 22: ClassTest03_3 클래스를 사용하여 c1 객체 인스턴스화
Line 23: Test 클래스를 사용하여 t1 객체 인스턴스화
Line 28~29: 실행을 ClassTest03_3 클래스 내의 메소드 안에서 하고 있기 때문에 ClassTest03_3의 클래스 변수인 num1 앞에 클래스명을 따로 적지 않아도 사용 가능하다. (권장하지 않음)
Line 31~32: 그러나 ClassTest03_3 클래스 외부에 있는 Test 클래스의 클래스 변수 num1은 인스턴스화 된 객체 t1을 통해서만 호출할 수 있다.
# 클래스 변수, 지역 변수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package classex; public class ClassTest03_2 { static int num1; // 클래스(static)변수 int num2; // 인스턴스(non-static)변수 public static void main(String[] args) { System.out.println("클래스 변수: " + num1); int num1 = 10; System.out.println("지역 변수: " + num1); System.out.println("클래스 변수: " + ClassTest03_2.num1); } } | cs |
# 실행 화면
# 동일한 변수명의 지역 변수가 선언되었을 경우
- 파란색 이탤릭체로 사용되었던 num1은 갈색의 지역 변수 num1으로 바뀌며 값은 10으로 된다.
- 클래스 변수와 지역 변수가 동일할 때 지역 변수가 우선순위로 적용된다.
- 그래서 변수 앞에 클래스명을 생략하지 않는 것을 권장하는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package classex; class Card { // 공통점: 가로, 세로 > 클래스 변수 // 차이점: 숫자, 문양 > 인스턴스 변수 static int width = 150; static int height = 300; int number; String shape; } public class ClassTest04 { public static void main(String[] args) { Card c1 = new Card(); // System.out.println(c1); // classex.Card@3d012ddd c1.number = 4; c1.shape = "Heart"; Card c2 = new Card(); c2.number = 7; c2.shape = "Spade"; // c1이 바꾼 공용 사물함의 w, h값은 c2에도 적용된다. c1.width = 300; c1.height = 150; System.out.println(c2.width); // 300 System.out.println(c2.height); // 150 } } | cs |
- 클래스 변수로 선언된 width와 height는 c1, c2가 동시에 사용할 수 있는 공용 사물함에 들어있다고 볼 수 있다.
- 인스턴스 변수로 선언된 number와 shape은 c1, c2 마다 다르기 때문에 각 자신의 개인 사물함에 들어있다고 볼 수 있다.
- 만약 c1 객체에서 공용 사물함에 있는 클래스 변수 width와 height의 값을 변경할 경우 그대로 저장이 되며
c2 객체에서는 변경된 클래스 변수를 사용하게 된다.
3. 메소드 (method) (총 4가지)
* 메서드는 호출할 때 메모리에 생성이 된다.
* 변수는 new를 붙일 때 메모리에 생성이 된다.
* 즉, 위의 두 가지 경우를 '동적 메모리 할당' 이라고 부른다.
* 리턴 타입: 총 8가지의 데이타 타입 (byte, short, int ... )
1) 클래스 메소드
(1) 리턴 타입이 없는 경우
1 2 3 4 5 | static void 메소드명() { // return; 생략 } 호출: 클래스명.메소드명(); | cs |
(2) 리턴 타입이 있는 경우
1 2 3 4 5 6 7 8 | static int 메소드명() { // return + 리턴타입과 같은 타입의 값 return 10; } 호출: int num = 클래스명.메소드명(); System.out.println(num); | cs |
2) 인스턴스 메소드
(1) 리턴 타입이 없는 경우
1 2 3 4 5 | void 메소드명() { // return; 생략 } 호출: 인스턴스명.메소드명(); | cs |
(2) 리턴 타입이 있는 경우
1 2 3 4 5 6 7 | int 메소드명() { return 10; } 호출: int num = 인스턴스명.메소드명(); System.out.println(num); | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package classex; public class ClassTest05 { // 클래스 메서드 static int sum() { return 10 + 5; } static void getInfo() { System.out.println("리턴타입X 클래스 메서드"); } // 인스턴스 메서드 int multiply() { return 10 * 3; } void getName() { System.out.println("홍길동"); } public static void main(String[] args) { // 1. 클래스 메서드 System.out.println(ClassTest05.sum()); int num1 = ClassTest05.sum(); System.out.println(num1); ClassTest05.getInfo(); // 2. 인스턴스 메서드 ClassTest05 c1 = new ClassTest05(); System.out.println(c1.multiply()); c1.getName(); } } | cs |
# 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package classex; /* Tv 클래스 * 1. 특징(변수) * 1) Brand (String) * 2) Color (String) * 3) Price (int) * 4) Channel (int) * * 2. 기능(메서드) * 1) channelUp(): 1증가 * 2) channelDown(): 1감소 * */ class Tv { String brand; String color; int price; int channel; void channelUp() { channel++; } void channelDown() { channel--; } void showInfo() { System.out.println("브랜드: " + brand); System.out.println("색 상: " + color); System.out.println("가 격: " + price); System.out.println("채 널: " + channel); } } public class ClassTest06 { public static void main(String[] args) { Tv myTv = new Tv(); myTv.brand = "삼성"; myTv.color = "블랙"; myTv.price = 1000; myTv.channel = 7; myTv.showInfo(); myTv.channelDown(); myTv.channelDown(); myTv.channelDown(); myTv.channelUp(); System.out.println("현재 채널: " + myTv.channel); } } | cs |
'JAVA > JAVA1' 카테고리의 다른 글
JAVA1_day15 | 클래스 Class (3) (0) | 2017.12.28 |
---|---|
JAVA1_day14 | 추가공부 (0) | 2017.12.27 |
JAVA1_day13 | 추가공부 (0) | 2017.12.26 |
JAVA1_day13 | 클래스 Class (1) (0) | 2017.12.26 |
JAVA1_day13 | 2차 배열 Array (0) | 2017.12.26 |