1. 선언위치에 따른 변수의 종류
변수는 선언위치에 따라서 종류와 범위가 달라집니다.
종류는 아래 3가지 입니다.
① 클래스 변수
② 인스턴스 변수
③ 지역변수
클래스 변수는 앞에 static이 붙은 변수인데요
클래스가 메모리에 올라갈때 static영역에 올라갑니다.
인스턴스 변수는 클래스의 인스턴스를 new연산자를 통해 만들때 생성되구요
이 변수는 heap영역에 만들어집니다.
지역변수는 메서드 안에 있는 변수로,
메서드 내에서만 유효한 변수입니다.
인스턴스 변수는 꼭 초기화를 해주지 않아도 되지만 지역변수는 꼭 초기화를 해주어야합니다.
2. 클래스 변수와 인스턴스 변수
인스턴스 변수는 각 인스턴스 마다 가지는 고유의 값이고
클래스는 그 클래스를 통해 만드는 인스턴스에서 공통으로 가지는 값입니다.
<예제>
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package sec01_exam;
public class Card {
String kind; //카드의 무늬 = 인스턴스변수 -- 접근방법은? 참조변수명.인스턴스변수명
int number; // 카드의 숫자 - 인스턴스 변수
static int width = 100; // 카드의 폭 - 클래스, 정적, static , 공유변수
static int height = 250; // 클래스명.클래스변수명 접근
}
|
cs |
여기서 kind와 number는 인스턴스 변수
width와 height는 static변수입니다.
카드의 가로와 세로는 모두 공통적이므로 static으로 잡아주었습니다.
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
|
package sec01_exam;
public class CardEx {
public static void main(String[] args) {
//static은 인스턴스 생성 없이도 접근 가능
System.out.println("Card.width = " + Card.width);
System.out.println("Card.height = " + Card.height);
Card card1 = new Card();
card1.kind = "하트";
card1.number = 7;
System.out.println("card1의 상세");
System.out.println("무늬: " + card1.kind);
System.out.println("숫자: " + card1.number);
//정적변수는 반드시 클래스명. 정적 변수명으로 접근 후, 읽기 수정, 저장을 하는게 바람직한 방법이다.
// System.out.println("너비: " + card1.width);
// System.out.println("높이: " + card1.height);
System.out.println("너비: " + Card.width);
System.out.println("높이: " + Card.height);
Card.width = 50;
Card.height = 100;
System.out.println("너비: " + Card.width);
System.out.println("높이: " + Card.height);
}
}
|
cs |
static멤버는 인스턴스 생성없이도 클래스명.멤버명으로 접근이 가능합니다.
이렇게 인스턴스가 없는데도 접근이 가능합니다.
반면 인스턴스 멤버는 인스턴스가 생성되어야 접근이 가능합니다.
메모리 상에서는 이렇게 됩니다.
3. 메서드
메서드란 작업을 수행하기 위한 명령문의 집합입니다.
메서드에는 선언부 구현부로 나뉘는데
public int add(int a, int b){
return a + b;
}
이렇게 있으면 {} 이 부분이 구현부, 그 앞부분이 선언부입니다.
선언부에는 public 접근 제어자/ int 리턴타입/ add 메서드명 / (int a , int b) 매개변수
이렇게 구분을 합니다.
메서드는 클래스 영역에 선언할 수 있습니다.
main영역에 선언할 수 없다는 말입니다
3-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 sec01_exam;
public class MyMath {
//인스턴스 메서드
public long add(long a , long b) {
//이게 가능한 이유가 add()가 호출될 시점은 이미 MyMath클래스의
//인스턴스가 생성되었기 때문
return a + b;
}
public long substract(long a, long b) {
return a - b;
}
//정적 메서드
public static long multiply(long a, long b) {
return a * b;//this를 사용할 수 없다. 그 이유는 인스턴스가 언제 생성될지 아무도 모르기 때문
}
public static long divide(long a, long b) {
return a / b;
}
public String studyJava() {
//지역변수(로컬변수)는 절대로 static붙이면 안된다.
//static int a ;
//지역변수는 반드시 초기화를 해야한다.
//int a ;
//System.out.println(a);
return "Java수업을 합니다";
}
}
|
cs |
무엇이 인스턴스 메서드이고 무엇이 정적 메서드일까요??
메서드에는 return문이 있는데요
리턴타입이 있는 경우 return으로 그 리턴타입으로 반환해주어야합니다.
위의 메서드를 보시면
add는 선언부에서 long타입으로 반환하라고 했으니 return으로 long타입을 반환하는 것입니다.
studyJava()는 리턴타입이 String이니 리턴을 문자열로 리턴하는 것입니다.
리턴타입이 없는 경우 선언부에는 void라고 쓰는데요
그럴경우 return문은 필요없습니다.
<실행클래스>
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
|
public class MyMathEx {
static int plus(int x, int y) {
return x + y;
}
int minus(int x, int y) {
return x - y;
}
public static void main(String[] args) {
//인스턴스를 생성함
MyMath mm = new MyMath();
//인스턴스 메서드 호출이므로 참조변수로 접근하는 것은 무방하다.
long result1 = mm.add(5L, 3L); //L은 접미사이다. 안붙이면 int형이 된다.
long result2 = mm.substract(5L, 3L);
//multiply(), divide() 메서드는 정적(static)메서드이므로
//클래스명. 정적메서드명으로 접근하여야함.
long result3 = MyMath.multiply(5L, 3L);
long result4 = MyMath.divide(5L, 3L);
System.out.println("add(5L, 3L) = " + result1);
System.out.println("substract(5L, 3L) = " + result2);
System.out.println("multiply(5L, 3L) = " + result3);
System.out.println("divide(5L, 3L) = " + result4);
System.out.println(mm.studyJava());
//static은 static만 호출할 수 있다.
System.out.println(MyMathEx.plus(10, 5));
MyMathEx ex = new MyMathEx();
//minus()인스턴스 메서드이기에 반드시 인스턴스가 생성되어야
//아래와 같이 호출이 된다.
int result = ex.minus(10, 5);
System.out.println(result);
}
}
|
cs |
코드가 긴데 하나씩 살펴봅시다.
MyMathEx클래스 영역에 메서드들이 정의가 되었구요
plus는 static메서드, minus는 인스턴스 메서드입니다.
인스턴스 mm을 생성하였구요
add와 substract는 인스턴스 멤버메서드이기 때문에
인스턴스명.멤버명으로 접근 해주었습니다.
multiply와 divide는 static메서드이므로 클래스명.멤버명으로 접근을 해주었습니다.
밑에 코드도 자세히 보시면 이해가 될 것입니다.
'JAVA > java 이론' 카테고리의 다른 글
[자바JAVA] call by value & call by reference/ 값에 의한 참조 & 주소에 의한 참조 (0) | 2020.10.09 |
---|---|
[자바JAVA]JVM의 메모리구조- 호출스택 (0) | 2020.10.08 |
[자바JAVA] 객체지향개념1 - 클래스와 객체, 클래스 접근 제어자, 메서드 구성 (0) | 2020.10.07 |
[자바 JAVA] 이차원 배열,int 2차원 배열, 향상된 for문 (0) | 2020.10.05 |
[자바JAVA]일차원 배열 , 배열의 길이, 배열의 선언방법, 배열 초기화, 배열 출력 (0) | 2020.09.26 |