※JAVA - 변수, 메서드
1. 변수
1) 변수 종류: 종류를 결정하는 조건은 변수의 선언된 위치 / static 키워드
- 클래스 변수 (cv)
다른 클래스의 메서드에서도 사용가능하다 ex) A 클래스의 static 변수 선언했으면 B클래스의 메서드에서도 A 클 래스 static 변수 사용가능하다.
클래스 영역에 있으면서 static 붙은 거
클래스가 메모리에 올라갈 때 생성
모든 인스턴스가 공통된 저장공간(변수)을 공유하기 때문에 공통적인 값을 유지해야 하는 경우 클래스 변수로 선언한다.
사용 시 : 클래스명. 변수명 형식으로 사용한다.
- 인스턴스 변수(iv)
클래스 영역에 있는 거
인스턴스가 생성될 때 생성(heap에 올라갈 때)
인스턴스가 생성될 때마다 독립적인 저장공간을 갖게 되기 때문에 각각 고유한 값을 가져야 하는 경우 인스턴 스 변수로 선언한다.
- 지역 변수(lv)
클래스영역이 아닌(메서드, 생성자) 영역에 있는 변수 뜻함
{}와 같은 스코프 영역 안에 있는 거
2. 메서드 (자바에서 중요한 개념 중에 하나)
-> 특정 작업을 수행하는 코드를 하나로 묶어놓은 것.
1) 장점: 높은 재사용성
중복코드 제거
2) 선언방법
메서드는 '선언부'와 '구현부'로 구성된다.
'선언부': [접근제어자] [static] 리턴타입 메서드이름([매개변수]) -> [] 안에 있는 것은 생략가능한 것.
리턴타입, 메서드이름 은 필수
*리턴 안 하는 메서드면 리턴타입은 void로 하면 됨.
*리턴하는 메서드면 리턴하려는 자료형에 맞춰서 리턴타입 명시하면 된다.
'구현부': {실행문}
* 가장 많이 작성하는 메인메서드를 보면 public static void main(String [] args)로 되어 있는데
public - 접근제어자
void - 리턴타입(리턴 없다는 뜻)
main - 이름(메서드 이름은 소문자로만 쓰기)
※JAVA - 변수, 메서드 예제 1
public class Ex17_1_변수와메서드 {
String ttt(){
return " ";
}
public static void main(String[] args) {
System.out.println("홍길동씨 " + AA.str); //홍길동씨 헬로
//AA에 str 클래스변수는 static이기떄문에 따로 new안해도 사용가능하다.
AA a = new AA();
System.out.println(a.num1); //100
System.out.println(AA.str); // 헬로
a.tmp(); //바이
BB b = new BB();
b.tmp(); // 헬로 누구씨
}
} //Ex17_1_변수와메서드 메인클래스 끝나는부분
//AA라는 외부클래스
class AA {
static String str = "헬로"; // 클래스변수
int num1 = 100; // 인스턴스 변수
void tmp() {
int num2 = 200;
System.out.println(BB.str2);
}
}
//BB라는 외부클래스
class BB {
static String str2 ="바이";
void tmp() {
System.out.println(AA.str + " 누구씨");
}
}
1) static String str = "헬로"
static String str2 ="바이"
-> 이렇게 static으로 선언한 클래스 변수들은 해당 프로그램 실행 시 바로 heap메모리에 올라가므로
new 인스턴스화 없이 사용할 수 있다.
-> 그리고 다른 클래스에도 사용가능합니다.
class AA {
// BB클래스의 static 변수인 str2를 가져와 사용한것이다.
void tmp() {
int num2 = 200;
System.out.println(BB.str2);
}
}
2) class AA {
int num1 = 100;
void tmp() {
int num2 = 200;
System.out.println(BB.str2);
}
}
-> 이렇게 외부클래스에 static 하지 않은 변수나 메서드들은 다른 클래스에서 사용하려면 new 인스턴스화해서 그 객체에 변수, 메서드들을 불러와서 사용할 수 있다.
public static void main(String[] args) {
AA a = new AA();
System.out.println(a.num1);
a.tmp();
}
※JAVA - 변수, 메서드 예제 2
-> 결괏값이 아래처럼 나오게 하려고 한다.
main 시작
Method1 시작
Method2 시작
Method2 끝
Method1 끝
main 끝
1. 만약 method1 이 static 메서드 라면
public class Ex17_2_static메서드와_인스턴스메서드 {
public static void main(String[] args) {
Ex17_2_static메서드와_인스턴스메서드 sc =new Ex17_2_static메서드와_인스턴스메서드();
System.out.println("main 시작");
Method1(); //1) main시작 출력후 Method1() 호출해서 Method1()로 이동한다.
System.out.println("main 끝"); //5) main 끝 출력해준다.
}
static void Method1(){
System.out.println("Method1 시작");
Method2(); //2) Method1 시작 출력하고 Method2() 호출해서 Method2()로 이동한다.
System.out.println("Method1 끝");
//4) Method1 끝 출력해주고 void main에서Method1(); 호출했던부분으로 돌아가서 그다음
//출력문인 main 끝 을출력한다.
}
void Method2(){
//3) Method2 시작, Method2 끝 출력이끝나면 다시 Method1()에 Method2()호출했던부분으로
//돌아가서 그다음 Method1 끝 을 출력해준다.
System.out.println("Method2 시작");
System.out.println("Method2 끝");
}
}
2. 만약 method1 이 static 메서드가 아니라면
public class Ex17_2_static메서드와_인스턴스메서드 {
public static void main(String[] args) {
Ex17_2_static메서드와_인스턴스메서드 sc =new Ex17_2_static메서드와_인스턴스메서드();
System.out.println("main 시작");
sc.Method1();
System.out.println("main 끝");
}
/*static*/ void Method1(){
System.out.println("Method1 시작");
Method2();
System.out.println("Method1 끝");
}
void Method2(){
System.out.println("Method2 시작");
System.out.println("Method2 끝");
}
}
1) method1이 static 메서드가 아니라면 static 한 main메서드에서 쓰기 위해서는 해당클래스에서 new인스턴스 객체를 만들어서 그 객체 안에 Method1() 메서드를 불러와 사용할 수 있을 것이다.
-> static 한 main메서드 프로그램 실행 시 heap메모리에 생성이 된다. 그리고 static 메서드가 아닌 method1 은 heap 메모리에 생성된 게 아니라 해당클래스 영역 안에 있을 것이다.
-> 그래서 static 메서드가 아닌 method1을
public static void main(String[] args) {
// method1 를 가지고 있는 클래스를 인스턴스화 시키면됨.
Ex17_2_static메서드와_인스턴스메서드 sc =new Ex17_2_static메서드와_인스턴스메서드();
System.out.println("main 시작");
sc.Method1();
System.out.println("main 끝");
}
2) static 한 메인 메서드에서 new객체에 method1을 호출해서 method1함수로 이동해서 " method1 시작 " 출력문을 수행할 것이고 그다음엔 method2를 호출해야 되는데 이때는 따로 method2를 new안 해도 사용할 수 있는 이유가 같은 클래스에 있는 메서드 이기도 하고 같은 메모리 영역 안에 있는 메서드이므로 따로 new 안 해도 method2를 호출할 수 있는 것이다.
/*static*/ void Method1(){
System.out.println("Method1 시작");
Method2();
System.out.println("Method1 끝");
}
'국비교육' 카테고리의 다른 글
국비지원 59일차 (JAVA - 접근제어자, 캡슐화) (1) | 2023.10.17 |
---|---|
국비지원 58일차(JAVA - 오버로딩,생성자,상속) (2) | 2023.10.16 |
국비지원 56일차 (JAVA - 객체지향언어 ,클래스, 객체) (0) | 2023.10.13 |
국비지원 55일차 (JAVA - 배열) (0) | 2023.10.12 |
국비지원 54일차 (JAVA - 연산자, 문자열,조건문(if,switch공식)) (0) | 2023.10.11 |