변수는 세 가지 종류가 있다
클래스 변수
인스턴스 변수
지역 변수
클래스 변수와 인스턴스 변수는 전역 변수라고 부르기도 한다
(전 영역에서 사용 가능해서 인듯)
클래스, 인스턴스, 전역 변수는 선언 위치에 따라 다른데요
class Variable
{ int iv; <- 인스턴스 변수
static int cv; <-클래스 변수(스태틱 변수)
void method() { int lv;<-지역변수 }
};
인스턴스 변수
ㄴ 클래스 영역에 생성, 인스턴스를 생성할 때 만들어짐, 객체마다 서로 다른 값을 가진다
클래스 변수
ㄴ static을 붙이면 클래스 변수, 공통된 저장 공간, 얘는 값이 안 달라지고 바꾸면 다같이 바뀜
클래스명.클래스변수 로 불러옵니다. 인스턴스 생성 전에도 사용 가능해요
지역 변수
ㄴ메소드 안에서만 사용 가능, 메소드 종료시 자동 소멸
공통적으로 값을 유지해야 하는 경우 static을 붙여 클래스 변수로
개별적인 값을 가지는 경우는 인스턴스 변수로
Card() c1 과 c2의 인스턴스 변수는 각기 다를 수 있으나
c1과 c2의 클래스 변수는 공통된 값을 갖고 있다(하나 바뀌면 모조리 바뀜)
메소드란?
특정 작업을 하는 일련의 문장들을 하나로 묶은 것
메소드를 이해 못하더라도,
메소드의 입력값과 출력값만 알면 됩니다!!!
int/반환타입 add/메소드 이름 (int a, int b)/매개변수 선언
int add (int a, int b) <-선언부
{ int result =a+b; //요기부터
return result;<-반환값} //요기까지는 구현부
메소드 선언부
신중히 작성합니다
선언부를 변경하면, 모든 메소드 호출부분을 한꺼번에 바꿔야해서 ㅠㅠ
매개변수:입력값을 제공받기 위해 사용<-변수 타입 같아도 타입 생략 불가 int a, int b, int c....
입력해야할 매개 변수가 많다면? 배열이나 참조 변수를 이용해요!
입력받을 값이 없다면 () 괄호 안에 아무것도 안 쓰면 됨
반환타입: 출력값의 타입을 적는다, 반환값이 없다면 void<-사용
void print() { //입력값 없음() 출력값 없음void
System.out.println("블라블라")
}
메소드 구현부
메소드의 괄호 {} 내용 (호출됐을 때 수행 될 문장들)
메소드의 반환타입(출력)이 void가 아니라면?
무조건 return 반환값; 적어야함
반환값은 반환타입과 일치하거나, 자동 형변환이 가능해야함..
(int가 반환타입이라면 short byte 등도 반환값으로 가능)
매개변수가 여러개여도, return 값은 반드시 하나만!
int add(int x, int y) //매개변수가 여러개지만
{return x+y;} //반환 값은 하나!!
add(3,5) <- add메소드의 매개변수x에 3, y에 5를 대입... 반환값 8
결과를 꼭 사용하지 않아도 되긴 하지만, 보통은 변수에 저장한다
int result = add(3,5); //add의 값을 result에 저장함
1. class의 인스턴스 생성 후 Math m = new Math();
2.메소드를 호출(참조변수명,메소드명) m.add(x,y);
return은, 실행중인 메소드를 종료하고 호출한 메소드로 돌아간다
void는 return 안 써도 됨->컴파일러가 자동 추가해줌
반환타입이 void가 아니면->반드시 return 작성
if문 사용의 경우
if return 뿐만 아니라 else return도 추가해줘야함, 왜? if가 아니면 return값이 없어지잖아~
간단한 메소드라면 조건 연산자 사용 가능!
return x>=0? x:-x;
x가 0보다 크거나 같다면 x, 아니면 -x 반환
호출 스택
작업에 필요한 메모리 공간을 제공한다
메소드가 호출되면, 호출 스태에 호출된 메소드를 위한 메모리를 할당한다
ㄴ메소드가 작업하는 동안 지역변수(매개변수 포함)들과
연산 중간 결과 저장에 사용함
메소드 작업 끝->메모리 공간 반환 후 비워짐
1.메인메소드 호출, 메모리 공간 할당
2.메인메소드 수행
3.메인메소드 대기, 불러온 메소드 수행
4.불러온 메소드 끝(할당된 메모리 반환), 메인메소드 수행 재개
5.메인메소드가 끝나면 호출 스택 비움
<호출 스택의 특징>
- 메소드가 호출되면 수행에 필요한 만큼 메모리를 스택에 할당
- 메소드 수행 후, 사용했던 메모리를 반환하고 스택에서 제거
- 호출스택 맨 위 메소드가 실행중인 메소드
- 아래에 있는 메소드가 바로 위의 메소드를 호출한 메소드
반환 타입이 있는 메소드라면,
종료되어 결과값을 자신을 호출한 메소드에게 반환
->이 값으로 호출한 메소드는 계속 수행된다
기본형 매개변수:값을 읽기만 가능
참조형 매개변수:값을 읽고 변경 가능
반환 타입도 참조형이 될 수 있다!
static Data3 copy(Data3 d) { //데이터 반환 타입 Data3 입력값(매개변수)도 Data3의 참조변수
Data3 tmp = new Data3(); //Data3의 tmp 인스턴스 생성
tmp.x = d.x; //d.x의 값을 tmp.x에 집어넣음
return tmp; //tmp의 값이 d에 반환됨, d의 값은 tmp의 값으로 바뀜
}
static 메소드 / 인스턴스 메소드
static 메소드<-클래스 메소드 //static void 메소드명
인스턴스 메소드 <-앞에 아무것도 안 붙음 //void 메소드명
클래스 메소드는 클래스명.메소드이름 으로 호출 가능(객체 생성 안 해도 가능)
인스턴스 메소드는 반드시 객체가 있어야 호출
인스턴스 메소드: 인스턴스 변수가 수행에 필요할 때
클래스 메소드: 인스턴스 변수나 인스턴스 메소드 사용 안 할 때
ㄴ 둘이 같은 이름도 사용 가능하긴 함
static int add() {}
int add() {}
그렇다면
static은 언제 붙일까?
1. 인스턴스 변수 중, 모든 인스턴스에 공통적으로 사용할 때 static
ㄴ모든 인스턴스에서 같은 값이 유지되어야 하는 변수
ㄴ하나가 바뀌면 모든 객체에서 바뀌어야하는 변수
2.클래스 변수는 인스턴스를 생성하지 않아도 사용 가능!
ㄴ 클래스가 메모리에 올라갈 때, 이미 자동으로 생성
3.클래스 메소드는 인스턴스 변수 사용 불가!!
static -> 인스턴스 생성 전에도 사용 가능
instance -> 인스턴스가 반드시 있어야 사용 가능
static이 실행될 때, 인스턴스가 없을 수도 있잖아? 그래서 사용 자체가 안 됨
인스턴스 변수,메소드에는 static 변수,메소드 사용 가능
왜? static은 인스턴스 생성 전에도 이미 존재하니까!!
4.메소드 내에서 인스턴스 변수의 사용이 없다면, static을 붙이는 걸 고려한다
ㄴ 메소드 호출 시간이 짧아져서 성능이 향상됨
ㄴ static을 안 붙이면, 실행시 호출되어야 할 메소드를 찾는 과정이 추가적으로 필요해서 시간이 더 걸림...
같은 클래스 내에서는 인스턴스를 생성 안 해도 참조와 호추링 가능하다
그!러!나!
클래스 멤버가 인스턴스 멤버를 참조, 호출할 때는
인스턴스를 생성해야한다
ㄴ 인스턴스 멤버는 인스턴스가 있어야만 존재함, 클래스는 언제나 존재함
static은 인스턴스 메소드와 변수를 호출 불가...........
'국비 학원 가서 개발새발' 카테고리의 다른 글
국비학원 6일차) 클래스 생성자를 배우다(예습:상속) (1) | 2022.10.04 |
---|---|
혼자 공부) 오버로딩 외... (0) | 2022.10.02 |
국비학원 4일차) 클래스와 객체(자바의 정석 기초편으로 복습) (0) | 2022.09.29 |
국비학원 3일차) 2중 for문, if문 등등 코드 나열 (0) | 2022.09.28 |
국비학원 2일차) 반복문(for, while) Array(배열) (0) | 2022.09.27 |