06 변수와 메서드
● 선언위치에 따른 변수의 종류
○ 멤버 변수를 제외한 나머지 변수들은 모두 지역변수
1) 인스턴스 변수
■ 클래스 영역에 선언
■ 클래스의 인스턴스를 생성할 때 만들어짐
■ 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 인스턴스 먼저 생성해야 함
■ 인스턴스는 독립적인 저장공간 가짐
■ 인스턴스이름.멤버변수명
2) 클래스 변수
■ 인스턴스 변수 앞에 static 붙이면 됨
■ 모든 인스턴스가 공통된 저장공간을 공유하게 함(공통된 변수를 사용하게 함)
■ 인스턴스를 생성하지 않아도 언제나 사용 가능
■ 클래스명.클래스변수명
■ 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때 까지 유지
■ 전역변수의 성격을 가짐
3) 지역 변수
■ 메서드 내에 선언되어 메서드 내에서만 사용 가능
■ 메서드 종료되면 소멸되어 사용할 수 없음
■ { }(블록) 안에 선언하고, 블록 안에서만 사용 가능
● 메서드
○ 메서드 : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
○ 선언과 구현
■ 메서드를 정의한다 : 메서드의 선언부와 구현부를 작성한다
반환타입 메서드이름 (타입 변수명, 타입 변수명, …){
메서드 호출 시 시행될 부분
}
■ 선언부 : 메서드 이름, 매개변수 선언, 반환 타입
■ 매개변수 선언 : 매개변수도 메서드 내에 선언된 것으로 간주 -> 지역변수!
■ 이름 : 변수의 명명규칙대로 작성
■ 반환타입 : 메서드 작업수행 결과(출력)인 ‘반환값’의 타입
반환값이 없는 경우 void
■ 구현부
■ return문 : 작업을 수행한 결과인 반환값을 호출한 메서드로 전달
전달받는 곳과 전달하는 값의 타입이 일치하거나 자동 형 변환 가능한 것이어야 함
■ 지역변수 : 메서드 내에 선언된 변수들은 그 메서드 내에서만 사용 가능
○ 호출
■ 메서드이름{값1, 값2,…};
■ 인자 & 매개변수
□ 인자 : 메서드 호출할 때 괄호 안에 지정해준 값
□ 인자의 개수와 순서 = 호출된 메서드에 선언된 매개변수의 개수와 순서
인자의 타입 = 매개변수 타입 or 자동 형 변환 가능한 타입
□ 인자는 메서드가 호출되면서 매개변수에 대입됨
■ 메서드의 실행흐름
□ 같은 클래스 내의 메서드끼리는 참조변수 사용하지 않고 서로 호출 가능
□ static 메서드는 같은 클래스 내의 인스턴스 메서드 호출 불가능
→ static 메서드는 언제나 로딩되어 있지만 인스턴스 메서드는 인스턴스가 생성되어야 로딩되므로 언제나 사용할 수 있다는 보장이 없음
□ 메서드가 호출되면 지금까지 실행되던 메서드는 실행을 잠시 멈추고 호출된 메서드 실행
다 끝나면 복귀해서 기존 메서드 수행됨
□ 한 메서드의 결과를 출력하는 데 다른 메서드의 결과가 먼저 계산되어야 한다면 먼저 호출된 값보다 먼저 나중에 호출된 메서드가 수행되어 출력될 수 있음
○ return문
■ 현재 실행중인 메서드를 종료하고 호출한 메서드로 복귀
■ 반환값 유무에 상관없이 존재해야 하지만 void타입인 경우 컴파일러가 자동으로 return 넣어줌
■ 반환값 : 주로 변수가 오지만 수식도 써도 됨
○ 매개변수 유효성 검사
■ 매개변수 값이 적절한 것인지 확인하는 것이 중요
→ 타입만 맞으면 어떤 값도 매개변수를 통해 넘어올 수 있음
→ 가능한 모든 경우의 수에 대해 고민하고 대비하는 코드 짜야 됨
■ 적절하지 않은 값이 넘어오면
→ 매개변수 값을 보정하던가
→ 불가능 하면 return문 사용해서 작업 중단하고 호출한 메서드로 돌아가야 함
● JVM 메모리 구조
○ 메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거
○ 호출 스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드
○ 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드
● 기본형 매개변수와 참조형 매개변수
○ 기본형 매개변수 : 변수의 값을 읽기만 할 수 있음(read only)
기본형 값이 매개변수에 복사되어 넘겨줌
→ 메서드 안에서 변수 값이 변경되어도 원본은 멀쩡
○ 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있음 (read & write)
값이 저장된 곳의 주소가 매개변수에 복사되어 넘겨줌
● 참조형 반환 타입
○ 참조형 반환타입 값 : 객체의 주소!
● 재귀호출
○ 메서드 자신을 다시 호출하는 것
○ 무힌반복문처럼 조건문을 필수로 사용해야 함
○ 어떤 작업을 반복적으로 처리할 때 반복문이 너무 복잡하면 재귀호출로 간단히 할 수 있나 고민
→ 논리적 간결함이 있음
○ 재귀호출에 드는 비용보다 재귀호출의 간결함이 더 클 때 사용해야 함
→ 반복문보다 재귀호출문의 수행시간이 더 김
○ 스택오버플로우 : 너무 작거나 큰 값이 재귀호출의 인자로 들어가면 발생
→ 매개변수 유효성 검사가 중요!
● 클래스 메서드와 인스턴스 메서드
○ 메서드 앞에 static 붙으면 클래스 메서드, 없으면 인스턴스 메서드
○ 인스턴스 메서드 : 인스턴스 변수와 관련된 작업을 함
메서드의 작업을 수행하는 데 인스턴스 변수를 필요로 하는 메서드
인스턴스명.멤버변수명
○ 클래스 메서드 : 인스턴스와 관계없는 메서드(인스턴스 변수나 메서드 사용 안 하는 메서드)
클래스이름.클래스메서드이름
○ 멤버변수 : 클래스 영역에 선언된 변수
클래스 변수 : static 붙은 멤버변수
인스턴스 변수 : static 안 붙은 멤버변수
○ 모든 인스턴스에 공통으로 사용되는 것에 static 붙임
멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것에 static 붙임
○ 클래스 변수는 인스턴스 생성 없이 사용 가능
○ 클래스 메서드는 인스턴스 변수를 사용할 수 없음
○ 메서드 내에 인스턴스 변수 사용하지 않으면 static 붙이는 것을 권장
● 클래스 멤버와 인스턴스 멤버간의 참조와 호출
○ 같은 클래스에 속한 멤버들 간에는 인스턴스 생성 없이 서로 참조, 호출 가능
○ 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재
but, 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있음
클래스 멤버가 인스턴스 멤버 참조, 호출하고자 하는 경우 인스턴스 생성해야 함
○ 참조변수를 선언하지 않고 생성된 인스턴스는 한 번 사용 후 사용할 수 없음
● 오버로딩
○ 오버로딩 : 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
○ 오버로딩의 조건
(1) 메서드 이름이 같아야 함
(2) 매개변수의 개수 또는 타입이 달라야 함
오버로딩 된 메서드들은 매개변수에 의해서만 구별 가능
반환 타입은 오버로딩 구현에 영향 없읍! 무조건 매개변수!
○ 가변인자와 오버로딩
■ 가변인자 : 메서드의 매개변수 개수를 동적으로 지정하는 것
■ 타입 … 변수명 <- 선언
■ 가변인자 외에도 매개변수 더 있다면 가변인자를 매개변수 중에서 제일 마지막으로 선언해야 함
■ 내부적으로 배열을 이용함
→ 가변인자가 선언된 메서드 호출할 때마다 배열이 새로 생성
■ 매개변수 타입을 배열로 하면 반드시 인자를 지정해줘야 되기 때문에 인자 생략 불가능
■ 가변인자를 선언한 메서드를 오버로딩하면 메서드를 호출했을 때 구별되지 않는 경우가 있음
하지 않는 것이 좋다
'JAVA > 이론' 카테고리의 다른 글
[java][이론] 008 상속 (0) | 2020.07.06 |
---|---|
[java][이론] 007 생성자와 변수의 초기화 (0) | 2020.07.04 |
[java][이론] 005 클래스와 객체 (0) | 2020.07.02 |
[java][이론] 004 배열 (0) | 2020.06.29 |
[java][이론] 003 조건부 흐름 제어 및 반복문 (0) | 2020.06.25 |