본문 바로가기
자바학점을 자바줘 (JAVA)

[자바] 클래스와 메소드 심화 개념

728x90

2022.04.07 - [자바학점을 자바줘] - 객체와 클래스 기본 개념

 

객체와 클래스 기본 개념

c++과 비주얼 스튜디오만 사용해보다가 자바와 이클립스를 처음 접해보기 때문에 헷갈리고 좀 불편하다고 느꼈다. 특히 자바는 class가 중요하기 때문에 c++때 얼렁뚱땅 class를 배운 나는 다시 한

zenstudy.tistory.com

앞에서는 기본 개념에 대해 배웠고

더 깊이 클래스에 대해 알아볼 것이다.

사실 알아보기 싫다.

 

 

자바의 접근 제어 지정자에 대해 알아보자.

접근 지정자 클래스 패키지 자식 클래스 전체 세계
public O O O O
protected O O O X
없음 O O X X
private O X X X

 

 

예제 프로그램으로 이해를 해보자면

class A {
	private int a; 	// 전용 
	int b; 			// 디폴트 
	public int c; 		// 공용 
}

public class Test {
	public static void main(String args[]) {

		A obj = new A();	// 객체 생성

		//obj.a = 10;		// 전용 멤버는 다른 클래스에서는 접근 안 됨
		obj.b = 20;		// 디폴트 멤버는 접근할 수 있음
		obj.c = 30;		// 공용 멤버는 접근할 수 있음
	}
}

 

 

이 부분은 사실 c++에서도 했으니 

빠르게 넘어가겠다.

 

 

다음은 접근자와 설정자이다.

접근자(accessor, getter) : 필드의 값을 반환하는 메소드

설정자(mutator, setter) : 필드의 값을 설정하는 메소드

 

 

예제 프로그램으로 이해를 해보자면

public class Account {
	private int regNumber;
	private String name;
	private int balance;

	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public int getBalance() {return balance;}
	public void setBalance(int balance) {this.balance = balance;}

}
public class AccountTest {

	public static void main(String[] args) {
		Account obj = new Account();
		obj.setName("젠");
		obj.setBalance(130);
		System.out.println("이름은 " + obj.getName() + " 통장 잔고는 "
				+ obj.getBalance() + "원 입니다.");
	}
}

출력 결과

정말 130원 있으니 걱정하지 말아라.


 

생성자에 대한 개념도 알아야 한다.

생성자는 객체 생성할 때 객체를 초기화하는 특수한 메소드이다.

클래스 이름과 동일한 메소드가 생성자이다.

 

public class Zen {
	Zen() {
    
    }
}

 

메소드처럼 생성자도 오버로딩될 수 있다.

public class Date {
	private int year;
	private String month;
	private int day;

	public Date() { // 기본 생성자
		this(1999, "1월", 1);
	}

	public Date(int year) { // 생성자
		this(year, "1월", 1);
	}

	public Date(int year, String month, int day) { // 생성자
		this.month = month; // this는 현재 객체를 가리킨다.
		this.day = day;
		this.year = year;
	}

	@Override
	public String toString() {
		return "Date [year=" + year + ", month=" + month + ", day=" + day + "]";
	}
}
public class DateTest {
	public static void main(String[] args) {
		Date date1 = new Date(2022, "4월", 8); 
		Date date2 = new Date(2028); 
		Date date3 = new Date(); 
		System.out.println(date1);
		System.out.println(date2);
		System.out.println(date3);
	}
}

 

 

필드를 초기화 하는 방법은 여러가지가 있다.

 

 

 

1. 필드 선언시 초기화

 

 

public class Zen {
	public int zenage = 5;	//5로 초기화
    private boolean zenhappy = false;	//false로 초기화
 }

 

 

 

2. 인스턴스 초기화 블록 (instance initializer block)

: 초기화 블록이 생성자에 복사됨

여러 생성자가 동일 코드 공유

무명클래스(이름이 없는 클래스)에서 유용

 

 

public class Zen {

	int score;
	
	Zen()
	{
		System.out.println("젠의 성적은 "+score+"점");
	}
	
	//초기화 블록
	{
		score = 100;
	}
	public static void main(String[] args) {
		Zen z1 = new Zen();
		Zen z2 = new Zen();

	}

}

출력 결과


 

 

다음은 메소드로 객체를 전달하고 반환하는 법이다.

 

 

 

1. 기초형 변수 전달 (값 복사)

 

public class MyCounter {
	int value;
	void inc(int a) {
		a = a + 1;
		System.out.println("a = " + a);
	}
}
public class MyCounterTest1 {
	public static void main(String args[]) {

		MyCounter obj = new MyCounter();
		int x = 10;

		System.out.println("x = " + x);
		obj.inc(x);
		System.out.println("x = " + x);
	}
}

x는 전달되기 전과 후의 값이 같은걸 확인할 수 있다.

출력 결과

 

 

 

2. 참조 변수 전달 (참조 복사)

public class MyCounter {
	int value = 0;
	void inc(MyCounter ctr) {
		ctr.value = ctr.value + 1;
	}
}
public class MyCounterTest2 {
	public static void main(String args[]) {
		MyCounter obj = new MyCounter();

		System.out.println("obj.value = " + obj.value);
		obj.inc(obj);
		System.out.println("obj.value = " + obj.value);
	}
}

출력 결과

참조 변수인 경우는 참조값이 복사 되어 매개 변수로 전달된다.

따라서 인수와 매개 변수 모두 동일한 객체를 가르킨다.

 

 

 

3. 메소드에서 객체 반환하기

package boxtest;
public class Box {
	int width, length, height;
	int volume;

	Box(int w, int l, int h) {
		width = w;
		length = l;
		height = h;
		volume = w * l * h;
	}

	Box whosLargest(Box box1, Box box2) {
		if (box1.volume > box2.volume)
			return box1;
		else
			return box2;
	}

}
package boxtest;
public class BoxTest {
	public static void main(String args[]) {
		Box obj1 = new Box(10, 20, 50);
		Box obj2 = new Box(10, 30, 30);

		Box largest = obj1.whosLargest(obj1, obj2);
		System.out.println("(" + largest.width + "," + largest.length + ","
				+ largest.height + ")");
	}
}

출력 결과

whoLargest에서 2개의 박스 중에서 큰 박스 객체를 반환하고 있다.

 


 

 

클래스의 멤버는 인스턴스 멤버와 정적 멤버로 나누어진다.

 

 

 


정적 멤버 특징

- 예약어 static 사용

- 정적 멤버는 하나만 생성됨

- 모든 객체가 공유

- 클래스 이름으로 접근 가능


 

 

인스턴스 변수는 인스턴스 마다 별도로 생성된다.

정적 변수는 하나의 클래스에 하나만 존재하며 모든 객체에 공통인 변수이다.

 

class Cat {
	int age; //인스턴스 변수
    boolean sleep; //인스턴스 변수
    stastic int agecount; //정적 변수
   }

 

예시를 통해 한번더 알아보자.

 

public class Cat {
	private String name;
	private String type;
	private int age;
	
	private int number;
	static int count = 0; //생성된 Cat 객체의 개수를 위한 정적변수
	
	public Cat(String n, String t, int a)
	{
		name = n;
		type = t;
		age = a;
		
		number = ++count;
	}

}
public class CatTset {

	public static void main(String[] args) {
		Cat c1 = new Cat("나비", "시고르자브종", 2);
		Cat c2 = new Cat("야옹이", "페르시안", 4);
		
		int x = Cat.count; //정적변수
		
		System.out.println("고양이 수 = " + x);

	}

}

출력결과

 

 

변수와 마찬가지로 메소드도 정적 메소드를 만들 수 있다.

 

public class Cat {
	private String name;
	private String type;
	private int age;
	
	private int number;
	private static int count = 0; //실체화된 Cat 객체의 개수를 위한 정적변수
	
	public Cat(String n, String t, int a)
	{
		name = n;
		type = t;
		age = a;
		
		number = ++count;
	}

	// 정적 메소드 
    public static int getNumberOfCats() {
          return count;
    }
}
public class CatTset {

	public static void main(String[] args) {
		Cat c1 = new Cat("나비", "시고르자브종", 2);
		Cat c2 = new Cat("야옹이", "페르시안", 4);
		
		int x = Cat.getNumberOfCats(); //정적 메소드 호출
		
		System.out.println("고양이 수 = " + x);

	}

}

정적 메소드를 사용해도 위와 같은 값이 출력된다.

 


 

자바는 클래스 안에서 클래스를 정의할 수 있다.

 

외부 클래스 : 내부에 클래스를 가지고 있는 클래스

내부 클래스 : 클래스 내부에 포함되는 클래스

 

class OuterClass {
	
    class InnerClass {   }  //클래스가 다른 클래스 안에 내장
    
 }

 

내부 클래스의 사용 예시이다.

 

import java.util.ArrayList;

public class GameCharacter {
	
	//내부 클래스 정의
	private class GameItem {
		String name;
		int type;
		int price;

		int getPrice()
		{
			return price;
		}

		@Override
		public String toString() {
			return "게임 아이템 [이름=" + name + ", 종류=" + type + ", 가격=" + price + "]";
		}
	}

	private ArrayList<GameItem> list = new ArrayList<>();

	public void add(String name, int type, int price) {
		GameItem item = new GameItem();
		item.name = name;
		item.type = type;
		item.price = price;
		list.add(item);
	}

	public void print() {
		int total = 0;
		for (GameItem item : list) {
			System.out.println(item);
			total += item.getPrice();
		}
		System.out.println("총합 : " + total);
	}
}
public class GameChracterTest {
    public static void main(String[] args) {
    	GameCharacter charac = new GameCharacter();
    	charac.add("검", 1, 100);
    	charac.add("총", 2, 50);
    	charac.print();
    }
}

출력결과

 


너무 뒤죽박죽 정리한 느낌이지만

내가 써왔던 글은 계속해서 수정을 반복할 것 같다.

사실 시험이 얼마 남지 않았다.

1회독도 안했다.

728x90

'자바학점을 자바줘 (JAVA)' 카테고리의 다른 글

[자바] 람다식, 패키지  (0) 2022.04.24
[자바] 인터페이스  (0) 2022.04.24
[자바] 상속  (0) 2022.04.21
[자바] String 클래스 개념  (0) 2022.04.07
[자바] 객체와 클래스 기본 개념  (0) 2022.04.07