728x90
728x90

* 이 글은 제가 공부하기 위해 최대한 사실에 입각해 내용을 적으려고 하지만 일부 내용들이 정확하지 않을 수 있습니다.

   혹시나 잘못된 부분이 있으면 너그럽게 이해해주시고 피드백 부탁드려요!

 


2023.01.13 - [공부/풀스택 과정] - [풀스택과정] JAVA 6장 배열 7장 클래스

 

[풀스택과정] JAVA 6장 배열 7장 클래스

* 이 글은 제가 공부하기 위해 최대한 사실에 입각해 내용을 적으려고 하지만 일부 내용들이 정확하지 않을 수 있습니다. 혹시나 잘못된 부분이 있으면 너그럽게 이해해주시고 피드백 부탁드려

cloudjini.tistory.com


7.4 필드

필드는 객체의 고유한 속성이나 상태값을 저장하는 곳이다. 필드는 클래스 중괄호 블록 안에 어디에서든 선언될 수 있으며, 필드를 선언하는 방법은 변수의 선언 방법과 동일하다. 초기값 역시 선언 시 넣어줄 수 도 있고, 생략할 수도 있다. 필드는 멤버 변수라고도 부르며, 멤버 변수는 클래스 변수와 인스턴스 변수로 나눌 수 있다.

종류 위치 선언 방법 생성시기
클래스 변수 클래스 블록 내 static int number; 클래스가 메모리에 로드
인스턴스 변수 int number; 객체 생성
지역 변수 메서드 등 기타 블록 내  int number; 해당 실행문이 실행될 때

클래스 변수(class variable)은 클래스 블록 내의 영역에 선언되며, 선언 방법은 변수의 자료형 앞에 static이라는 키워드를 붙이면 된다. 이 클래스 변수는 모든 객체가 공유되는 변수이다. 객체를 생성하지 않아도 바로 사용할 수 있다. 사용 방법은 클래스명.클래스변수명 형태로 사용한다. 

 

인스턴스 변수(instance variable)도 클래스 변수와 같이 클래스 블록 내의 영역에 선언되지만 static 키워드는 붙지 않는다. 일반적인 변수 선언 방법으로 선언하면 된다. 인스턴스 변수는 객체를 생성할 때 생성되며, 객체는 서로 독립적이기 때문에 이 인스턴스 변수 역시 객체마다 독립적인 값을 갖는다. 사용 방법은 객체명.인스턴스변수명 형태로 사용된다.

 

다시 정리하면, 인스턴스 변수는 객체마다 독립적인 값을 갖고, 클래스 변수는 모든 객체들이 공유되는 변수이다. 또한 클래스 변수는 객체 생성 없이도 클래스명 만으로 사용할 수 있지만, 인스턴스 변수는 반드시 객체를 먼저 생성하고 객체를 통해 사용해야만 한다. 그렇지 않으면 에러가 나게 된다.

 

지역변수의 사용가능한 법위를 쉽게 구분 지을 수 있는 방법은 범위(scope)는 중괄호 블록으로 구분지으면 쉽게 이해할 수 있다. 선언된 중괄호 안에서는 모두 사용될 수 있다. 

package chapter07;

public class VarEx {
	public static void main(String[] args) {
		
		// 클래스 변수 사용  // 어떤 변수의 타입?
		System.out.println("Avante 제조사 : " +Avante.company);
		
		Avante a1 = new Avante();
		Avante a2 = new Avante();
		
		// 인스턴스 변수의 값 변경
		a1.color = "화이트";
		a2.color = "블랙";
		
		// 인스턴스 변수 출력
		System.out.println("a1 색상 : "+a1.color);
		System.out.println("a2 색상 : "+a2.color);
		
		// 클래스 변수를 인스턴스 객체로 출력
		System.out.println("a1 제조사 : "+a1.company);
		System.out.println("a2 제조사 : "+a2.company);
		
		// 클래스 변수의 값 변경
		a1.company = "기아";
		
		// 클래스 변수의 값 변경 후 클래스 변수와 인스턴스 변수 출력
		System.out.println("Avante 제조사 : "+ Avante.company);
		System.out.println("a1 제조사 : "+ a1.company);
		System.out.println("a2 제조사 : "+ a2.company);
		
	}
}

class Avante {
	String color; // 인수턴스변수
	static String company =  "현대";  // 클래스변수
}
package chapter07;

public class LocalValEx {
	public static void main(String[] args) {
		
		Local local = new Local();
		
		System.out.println(local.name); // Null
		
		local.process();
		System.out.println(local.name); // 홍길동
		
		local.printAge1();
		local.printAge2();
		local.printAge();
		
		// for문 블록 내에서의 변수 선언
		for(int i = 0; i <10; i++) {
			int temp = 0;
			temp += i; 
		}
		
//		System.out.println(temp); // 에러
	}
}

class Local {
	
	String name;
	int age;
	void process() {
		name = "홍길동";
	}
	void printAge() {
		int age = 10; // 이걸 삭제하면
		System.out.println(age); // age 색깔 바뀜 (파랑색으로)
		System.out.println(this.age); // 전역변수 age로 지칭
	}
	
	void printAge1() {
		int age = 20; // 지역변수
		System.out.println(age);
	}
	
	void printAge2() {
		int age = 30; // 지역변수
		System.out.println(age);
	}
}

 

7.5 메서드

메서드는 클래스 멤버 중 기능에 해당하는 중괄호 블록이다. 이 블록은 이름을 가지고 있으며, 이 이름을 통해 메서드를 실행하게 되면 중괄호 블록에 있는 실행문들이 실행되게 된다.

 

메서드의 구조

메서드는 선언부와 실행부로 나눠지는데 선언부에는 접근제한자, 리턴타입, 메서드명, 매게변수가 정의되고, 중괄호로 블록의 영역을 구분한다. 중괄호가 끝나는 부분까지가 해당 메서드의 영역이 되는 것이다.

 

접근제한자

말 그대로 접근을 제한하는 키워드가 들어오는 자리다. 특정 키워드에 따라 이 메서드를 실행할 수 있는 권한을 제한할 수 있다.

 

리턴타입

메서드의 선언부 앞쪽에 리턴타입이 오는데 리턴타입이란 리턴되는 타입이다. 메서드는 특정 기능을 실행한 후 어떤 값을 실행한 곳으로 돌려줄 수 있는데 이 돌려주는 값의 데이터 타입(자료형)을 이 곳에 정의한다. 돌려주는 값을 리턴값이라고 하는데 메서드는 리턴값이 있을 수도 있고 없을 수도 있다. 만약 리턴값이 없다면 void라고 적어줘야한다. 우리가 지금까지 만들었던 main() 메서드도 리턴값이 없기 때문에 리턴타입이 void로 정의한 것이다. 만약 리턴값이 정수라면 int, 문자열이라면 String이라고 적어줘야한다.

 

메서드명 작성규칙

메서드명도 변수명 작성규칙과 같다. 숫자로 시작하면 안되고, 특수 기호는 $와 _만 사용가능하다. 또한 반드시 지켜야하는 법칙은 아니지만, 대부분의 개발자들이 따르고 있는 관례가 있다. 영문 소문자로 작성하되 만약 두 단어 이상으로 이루어져 있다면 두번째 단어부터는 첫 문자를 대문자로 작성하는 것이다. 프로그램을 대부분 나 혼자 개발하는 것이 아니고, 여러 사람들과 함께 개발하는 것이고, 다른 사람이 아니더라도 미래에 내가 다시 봤을 때에도 메서드 이름만 봐도 이 메서드가 무슨 기능을 하는 메서드인지 쉽게 알 수 있도록 이름을 잘 지어줘야한다.

 

매개 변수

매개역할을 하는 변수로서 메서드 입장에서 외부로부터 변수를 입력받기 위해 사용된다. 매개변수의 갯수가 정해져 있는 경우가 대부분이지만, 간혹 매개변수가 몇개가 올지 알 수 없는 경우가 있다. 이럴 때 첫 번째 방법은 매개변수를 배열로 선언하는 방법이고, 두번째는 매개변수를 선언할 때 타입과 변수명 사이에 ... (가변인자) 을 추가 하고 선언하는 것이다.

 

package chapter07;

public class ParamEx {
	public static void main(String[] args) {
		
		Param p = new Param();
		p.add(10,5);
		// p.add("10","5"); // 에러
		p.add2(10,5);
		
		p.add3(1,2,3,4,5,6,7,8,9,10);
		
	}
}

class Param {
	
	void add(int x, int y) {
		int z = x +y;
		System.out.println(z);
	}

	void add2(double x,double y) {
		double z = x + y;
		System.out.println(z);
	}
	
	void add3(int ... x) {
		int sum =0;
		for (int i =0;i <x.length; i++) {
			sum += x[i];
		}
		System.out.println(sum);
	}
	
}
package chapter07;

public class ParamEx2 {
	public static void main(String[] args) {
	
		int result = add(10,20);
		System.out.println(result);
		result = add(5,5);
		System.out.println(result);
		
		int x = 5;
		int y = 0;
		y = f(x); // x의 제곱 리턴
		System.out.println(y);
		
	}
	
	static int add(int x, int y) { // 메서드는 호출의 대상
		return x+y;
	}
	
	static int f(int x) {
		return x*x;
	}


} //
package chapter07;

public class ReturnEx2 {
	public static void main(String[] args) {
		
		Return2 obj = new Return2();
		
		obj.getTest(0);
		obj.getTest(1);
		
		System.out.println(obj.getName(0));
		System.out.println(obj.getName(1));
		
		
	}
}

class Return2 {
	
	void getTest(int type) {
		System.out.println("getTest() 메서드 시작");
		
		if (type ==1) {
			return;
			
		}
		System.out.println("getTest() 메서드 끝");
		//return;
	}
	
	String getName(int type) {
		
		if (type == 1) {
			return "이름없음";
			
		}
		
		return "홍길동";
	}
}

메서드의 실행(호출)

메서드를 샐행하는 곳을 크게 같은 클래스 내부에서 호출하는 경우와 다른 클래스 외부에서 호출하는 경우로 나눌 수 있다.

클래스 내부에서 즉, 같은 클래스에서 실행하는 경우는 그냥 메서드 이름만 적어주면 실행이 가능하다.

하지만 클래스 외부, 다른 클래스에 있는 메서드를 실행하는 경우는 먼저 해당 클래스를 객체로 생성한 후 객체를 통해 메서드를 실행해야 한다. 메서드를 실행할 때 주의할 점은 매개변수의 타입과 개수에 맞게 값을 넘겨줘야한다.

메서드도 변수와 마찬가지로 클래스 메서드와 인스턴스 메서드가 있다. 클래스 메서드는 클래스명으로 직접 실행이 가능하고, 인스턴스 메서드는 객체를 통해 실행할 수 있다.

package chapter07;


public class MethodCall {
	int i = 10;
	static int si = 20;
	
	public static void main(String[] args) {
		
		// 직접 실행
		Method.printName();
		
		// 객체를 생성해서 실행
		Method method = new Method();
		method.printEmail();
	
		System.out.println(new MethodCall().i);
		System.out.println(si);
	}
}

class Method {
	static void printName() {
		System.out.println("printName() 실행");
	}
	
	void printEmail() {
		System.out.println("printEmail() 실행");
		printId(); // 다른 메서드 실행
	}
	
	void printId() {
		System.out.println("printId() 실행");
	}
}

 

728x90
300x250