본문 바로가기
JAVA/이재환의 자바 프로그래밍 입문

[Java] Ch.9 클래스의 기초

by ♡˖GYURI˖♡ 2023. 10. 17.
728x90

객체(object)

우리가 표현할 수 있는 실제 세계의 모든 사물들

개념적인 객체 물리적인 객체
동물 개, 고양이, 호랑이, 곰
자동차 소나타, K5, SM5

 

 

클래스

프로그래밍에서 객체와 관련된 데이터와 처리 동작을 한데 모은 코드 뭉치

 

추상화 : 특징적인 데이터와 처리 동작을 추려내는 과정

  • 명사적인 특징을 뽑아내는 추상화 과정 → 멤버 변수(필드) 추출
  • 동사적인 특징을 뽑아내는 추상화 과정 → 멤버 함수(메서드) 추출
객체 목적 구분 객체 구분 추상화된 클래스 모델
탈 것 개인, 이륜 자전거, 오토바이 Bike
자동차 승용차, 버스, 트럭 Car
운송 수단 자동차, 배, 비행기 Vehicle

 

// 클래스 정의
class Npc 
{
    // 필드 - 데이터
    String name;
    int hp;
    // 메서드 - 동작
    void say() 
    {
        System.out.println("안녕하세요.");
    }
}

public class NpcUse 
{
    public static void main(String[] args) {
        // 클래스를 이용해 객체 생성
        // - 'NPC'란 설계도(클래스)를 이용해 NPC 객체 만들기 
        // 클래스 타입의 변수는 new 를 통해 객체를 생성한다.
        // 클래스 타입의 참조 변수는 스택에, 생성된 객체는 힙에 적재된다.
        Npc saram1 = new Npc();
        // 필드 접근
        saram1.name = "경비";
        saram1.hp = 100;
        System.out.println(saram1.name + ":" +
                           saram1.hp);
        // 메서드 호출
        saram1.say();
    }
}

//객체 만들기
//현실 --> 만들어진 자동차가 실제로 눈 앞에 보임
//컴퓨터 --> 객체를 메모리에 적재

 

 

객체와 클래스

클래스는 객체를 프로그래밍에서 사용하려고 추상화해서 기술해놓은 설계도

프로그래밍에서 사용하려면 설계도를 기초로 실체를 만들어야 함

 

  • 실체화 된 것 = 객체(object)
  • 실체화하는 작업 = '객체(object)를 생성한다' or '인스턴스화한다(instantiate)'

 

소프트웨어 세계에서 객체는 클래스라는 설계도대로 구현한 것을 메모리에 탑재해 메모리 주소를 부여한 것

 

  설계도   객체 생성(인스턴스화)   실물
실생활 자동차 설계도 공장 (생성된) 자동차
프로그래밍 클래스 new (메모리에 적재된) 값

 

Book myBook = new Book();

 

class Npc 
{
	String name;
	int hp;
	
	void say()
	{
		System.out.println("안녕하세요.");
	}
}


public class NpcUse
{

	public static void main(String[] args)
	{
		Npc saram1 = new Npc();
		
		saram1.name = "경비";
		saram1.hp = 100;
		System.out.println(saram1.name + " : " + saram1.hp);
		saram1.say();
	}

}

(new를 통해 새로 만들어지는 객체에서 사용하는 메서드에는 static을 붙이지 않음)

 

  • 객체 생성에 new 연산자 사용
  • 다른 객체의 멤버에는 .을 이용하여 접근

 

 

오버로딩

하나의 클래스 내에 매개변수 개수나 자료형은 다르지만 메서드명은 같은 메서드를 여러 개 정의하는 것

동일하거나 유사한 일을 수행하는 메서드가 전달받는 매개변수에 따라 각기 다른 연산을 하는 경우 유용함

 

class Calc 
{
    int add(int a, int b) 
    {
        return a + b;
    }

    int add(int a) 
    {
        return a + 1;
    }

    double add(double a, double b) 
    {
        return a + b;
    }
}

public class OverloadingUse
{
    public static void main(String[] args)
    {
        Calc calc = new Calc();
        int nRtn1 = calc.add( 3, 9 );
        int nRtn2 = calc.add( 3 );
        double nRtn3 = calc.add( 3.0, 9.0 );

        System.out.println("Rtn1 = " + nRtn1);
        System.out.println("Rtn2 = " + nRtn2);
        System.out.println("Rtn3 = " + nRtn3);
    }
}

 

System.out.println();		//매개변수 없이 줄바꿈만 출력
System.out.println(1);		//정숫값 출력
System.out.println("홍길동");	//문자열 출력

 

 

생성자(constructor)

객체 생성을 할 때만 호출하는 특수한 메서드

new 연산자가 객체의 생성자를 이용하여 객체를 생성

 

 

생성자의 특징

  • 생성자명 = 클래스명
  • 메서드이지만 반환형이 없는 형태

 

디폴트 생성자 : 클래스를 정의할 때 생성자를 기술하지 않으면 매개변수가 없는 생성자가 자동으로 만들어짐

  • 생성자명 = 클래스명
  • 메서드이지만 반환형이 없는 형태
  • 매개변수가 없음
  • 수행하는 기능 없음
class Book
{
	Book()
    {
    
    }
}

 

class Book 
{
    String title;
    int price;
    int num = 0;

    // 디폴트 생성자에 기능 부여
    Book() 
    {
        title = "자바 프로그래밍";
        price = 30000;
    }

    // 생성자의 오버로딩
    Book(String t, int p) 
    {
        title = t;
        price = p;
    }

    void print() 
    {
        System.out.println("제    목 : " + title);
        System.out.println("가    격 : " + price);
        System.out.println("주문수량 : " + num);
        System.out.println("합계금액 : " + price * num);
    }
}

public class ConstructorUse
{
    public static void main(String[] args)
    {
        Book book1 = new Book();
        book1.print();
        
        Book book2 = new Book("자바 디자인패턴", 35000);
        book2.num = 10;
        book2.print();
    }
}

 

 

접근 제한자

접근 제한자 설명
public 외부 클래스 어디에서나 접근 가능
protected 같은 패키지 내부와 상속 관계의 클래스에서만 접근 가능
(아무 표시X) 디폴트, 같은 패키지 내부에서만 접근 가능
private 같은 클래스 내부에서만 접근 가능

(패키지 = 클래스가 위치한 폴더)

 

정보 은닉화 : private을 적용하여 클래스 외부에서 클래스 내부로의 변수와 메서드에 대한 접근 제한

getter : private 멤버 변수로부터 값을 가져오는 메서드

setter : private 멤버 변수에 값을 대입하는 메서드

 

class Student1
{
    String name;	//default
    int age;		//default
}

class Student2
{
    public String name;
    private int age;
    
    public Student2(String name, int age)
    {
        this.name = name;
        this.age = age;
    }
    
    public int getAge()
    {
        return age;
    }
    
    public void setAge(int age)
    {
        if (age < 0 || age > 150)
        {
            System.out.println("나이가 부적절합니다.");
            this.age = 0;
            return;
        }
        this.age = age;
    }
}

public class PrivateUse
{
    public static void main(String[] args)
    {
        Student1 student1 = new Student1();
        student1.name = "홍길동";
        student1.age = -20;
        System.out.printf("%s의 나이는 %d살입니다.\n", 
                          student1.name, student1.age);    
        
        Student2 student2 = new Student2("전우치", 20);
        student2.name = "손오공";
        //student2.age = -10;
        student2.setAge(-10);
        int age = student2.getAge();
        System.out.printf("%s의 나이는 %d살입니다.\n",
                          student2.name, age);    
    }
}