[JAVA 8] 클래스에서 정의되는 변수의 종류와 메서드

[JAVA 8] 클래스에서 정의되는 변수의 종류와 메서드

Lecture
Language
태그
language
java
public
완성
Y
생성일
Mar 17, 2024 04:51 PM
LectureName
Java

1. 변수와 메서드

변수의 종류
변수의 종류는 선언된 위치를 잘 확인해야 한다. 크게 클래스 영역, 메서드 영억으로 나누어지며 클래스 영역에서는 변수 앞에 static이 붙었는가에 따라 구분하고 나머지는 다 지역(local) 변수이다.
class val{ int n1; //클래스 영역에 선언되었고 static이 붙지 않았음으로 인스턴스 변수 static int n2; //클래스 영역에 선언되었고 static이 붙었음으로 클래스 변수 void method(){ int n3; //지역변수 } }
➡️ 인스턴스 변수
클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다. 그렇기 때문에 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야한다.
 
➡️ 클래스 변수
클래스 변수를 선언하는 방법은 인스턴스 변수 앞에 static을 붙이기만 하면 된다. 인스턴스 변수와는 달리 클래스 변수는 모든 인스턴스 변수가 공통된 저장공간(변수) 를 공유하게 된다. 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 클래스 변수로 선언해야한다.
 
➡️ 지역변수
메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없게된다.
 
예시
package teach; import java.util.*; class Test{ static int a; //클래스 변수 int b; //인스턴스 변수 void alert() { int c = 3; System.out.println(c); //지역변수 } } public class TestCode{ public static void main(String[] agrs) { Test t1 = new Test(); t1.a = 3; t1.b = 4; Test t2 = new Test(); t2.a = 4; t2.b = 123; System.out.printf("t1.a = %d\nt2.a = %d\nt1.b = %d\nt2.b = %d",t1.a, t2.a, t1.b, t2.b); } } /* t1.a = 4 t2.a = 4 t1.b = 4 t2.b = 123 */
  • 클래스 변수는 다른 인스턴스에서 값을 바꿨음에도 불구하고 값이 전부 바뀌었다.
  • 인스턴스 변수는 각각 선언된 객체마다 값이 다르다.
 
 
 
기본형 매개변수, 참조형 매개변수
  1. 기본형 매개변수
class Data38 {int a;} public class c6_3_8{ public static void main(String[] args) { Data38 d38; d38 = new Data38(); System.out.printf("바뀌기 전 : %d\n",d38.a); //0 change(d38.a); System.out.printf("바뀐 후 : %d",d38.a); //0 } static void change(int a){ //기본형 매개변수 전달 a = 10; } }
  • 변수 a는 change라는 함수를 통과했지만 바뀌지 않았다 왜일까?
➡️ 이유
1) change메서드가 호출되면서 d38.a가 change 매서드 매개변수 x에 복사된다
2) change메서드에서 x의 값을 1000으로 변경
3) change메서드가 종료되면서 매개변수 x는 스택에서 제거됨
 
  1. 참조형 매개변수
class Data38 {int a;} public class c6_3_8{ public static void main(String[] args) { Data38 d38; d38 = new Data38(); System.out.printf("바뀌기 전 : %d\n",d38.a); //0 change(d38); System.out.printf("바뀐 후 : %d",d38.a); //1000 } static void change(Data38 d38){ //참조형 매개변수 전달 d38.a = 1000; } }
  • 이번에는 변수 a가 값이 1000으로 바뀌었다 왜일까?
➡️ 이유
1) change메서드가 호출되면서 참조변수의 d38 값(주소)가 매개변수 d38에 복사됨
2) change메서드에서 매개변수 d38로 a의 값을 1000으로 변경
3) d38은 메서드가 종료되면서 삭제됨
 
💡
두 변수의 차이점은 “주소 값 복사 or 그냥 복사” 의 차이라고 볼 수 있다.
  • 기본형 매개변수는 “값” 을 복사하고 참조형 매개변수는 “주소 값”을 복사한다.
 
 
메서드(Method)
클래스에 종속되어 있는 함수라고 생각하면 된다.
😀 Method 예제를 보자
class test{ //method void t1(){ System.out.println("testing"); } } class c6_3_3{ public static void main(String[] args) { test t; t = new test(); //선언된 클래스에서 method t1을 호출하여 사용한다. t.t1(); } }
이처럼 클래스에서 선언해주고 인스턴스를 생성해서 메서드를 사용하면 뭐가 좋을까?
 
 
Method를 사용하면 좋은 점
➡️ 높은 재사용성
클래스에 메서드를 선언해두기만 하면 객체를 생성할 때마다 함수를 선언해줄 필요가 없다.
➡️ 중복된 코드의 제거
재 사용성이 높기 때문에 코드가 중복되는 것을 막을 수 있다. 중복된 코드는 코드의 관리가 용이하여 오류가 발생할 확률을 줄일 수 있다.
➡️ 프로그램의 구조화
몇줄 안되는 프로그램에서는 구조라고 할 것 조차 없겠지만 천줄, 만줄, 십만줄이 넘어가는 코드에서는 해당 클래스와 메서드를 잘 정의해두면 요긴하게 쓸 수 있고 클래스와 메서드의 변수명 등에 신경 쓴다면 코드의 구조화에 큰 기여를 할 수 있다.
 
 
Method의 구조
class test{ int add(int a, int b){ //선언부 -> 반환타입 메서드이름(타입 변수명1, 타입 변수명2....) int c = a + b; //구현부 -> 지역변수 사용 및 연산 return c; //구현부 -> int형태의 반환임으로 return으로 int 반환 } int add2(int a, int b){ return a+b; //이런 형태로 바로 return도 가능하다. } void brodcast(String s){ System.out.println(s); return; //구현부 -> void형태는 컴파일러가 return을 자동으로 넣어주긴한다. } } class c6_3_4 { public static void main(String[] args) { test t; t = new test(); //클래스 선언 int result = t.add(1, 2); //메서드에서 연산한 결과를 result에 저장 t.brodcast("adding!"); //메서드 사용 System.out.print(result); } }
💡
항상 메서드에 매개변수를 넣어줄 때는 매개변수가 유효한지 검사해야 한다. ex) 어떤 수 a를 b로 나누는 프로그램에서 매개변수가 100, 0이 전달될경우 0으로 나눌 수 없기때문에 에러가 발생
  • Method 선언 후 구현 초반 부분에 매개변수의 유효성을 검증할만한 조건문을 작성할 수 있다.
 
 

2. 참조형 변환타입, 재귀호출

참조형 변환타입
참조형 변환타입이란 객체의 주소를 변환하는 것 이라고 표현할 수 있다.
class Data38 {int a;} public class c6_3_9 { public static void main(String[] args) { Data38 d; d = new Data38(); Data38 d2 = copy(d); System.out.println(d.a); System.out.print(d2.a); } static Data38 copy(Data38 d){ Data38 tmp; tmp = new Data38(); tmp.a = d.a; return tmp; } }
➡️ 설명
1) copy method가 실행되면서 참조변수 d의 값이 copy의 매개변수 d에 복사된다
2) copy에서 새로운 객체 tmp가 생성된 후 d.a에 저장된 값을 tmp.a에 복사한다
3) copy method가 종료되면서 return으로 tmp의 값을 반환하고 해당 값은 d2에 저장된다.
4) 복사된 주소값으로 d2를 사용할 수 있다. tmp가 d2인 셈이다.
 
➡️ 참조형 반환타입
  • 이처럼 함수에서 인스턴스를 생성한 후 해당 주소값을 반환한다
  • 반환된 주소값을 기준으로 인스턴스를 참조할 수 있다.
 
 
재귀호출(recursive call)
  1. 재귀호출이란?
  • 재귀호출이란 메서드 내에서 다시 자기 자신을 호출하는 것을 말한다.
//예시 void method(){ method(); }
 
  1. 재귀호출로 가능한 요소
  • 펙토리얼( ! )
import java.util.*; class factorial { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int number = scan.nextInt(); int result = fac(number); System.out.printf("result : %d", result); } static int fac(int num){ int result = 0; if (num==1){ result = 1; } else{ return num*fac(num-1); } return result; } }
 
 

클래스 메서드(static)와 인스턴스 메서드

선언
클래스 메서드와 인스턴스 메서드의 차이는 클래스 메서드는 객체를 생성하지 않고 호출이 가능하다. 클래스 내에서 static 을 붙이면 클래스 메서드이다.
 
클래스의 설계와 클래스&인스턴스 메서드의 차이
  1. 클래스를 설계할 때, 맴버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다
  1. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
  1. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
  1. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
 
💡
클래스 메서드는 인스턴스 변수를 사용할 수 없는 이유?
  • 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재한다(언제나 사용 가능하기 때문)
  • 하지만 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있다. (객체를 생성해야 인스턴스 변수가 메모리 상에 상주 하기 때문)
 
 
예시
package teach; import java.util.*; class Test{ static int a = 4; //클래스 변수 int b; //인스턴스 변수 static void alert() { int c = 3; System.out.println(c); //지역변수 } } public class TestCode{ public static void main(String[ System.out.println(Test.a); //그냥 사용 가능 Test.alert(); //그냥 사용 가능 } }