2022.04.07 - [자바학점을 자바줘] - 객체와 클래스 기본 개념
앞에서는 기본 개념에 대해 배웠고
더 깊이 클래스에 대해 알아볼 것이다.
사실 알아보기 싫다.
자바의 접근 제어 지정자에 대해 알아보자.
접근 지정자 | 클래스 | 패키지 | 자식 클래스 | 전체 세계 |
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회독도 안했다.
'자바학점을 자바줘 (JAVA)' 카테고리의 다른 글
[자바] 람다식, 패키지 (0) | 2022.04.24 |
---|---|
[자바] 인터페이스 (0) | 2022.04.24 |
[자바] 상속 (0) | 2022.04.21 |
[자바] String 클래스 개념 (0) | 2022.04.07 |
[자바] 객체와 클래스 기본 개념 (0) | 2022.04.07 |