본문 바로가기
Programming/Java

자바 클래스, 인스턴스, 메서드, 생성자, 오버로딩

by hyunipad 2021. 1. 6.
반응형

클래스와 인스턴스


자바는 흔히 객체지향적인 언어라고 말합니다.

그렇다면 객체지향적 프로그래밍이라는 것은 무엇을 뜻하는 걸까요?

Object Oriented Programming(객체지향적 프로그래밍) is A.P.I.E

A(Abstraction) : 추상화

P(Polymorphism) : 다형성

I(Inheritance) : 상속성

E(Encapsulation) : 캡슐화

이 4가지의 특성을 잘 이용해 만드는 것을 객체 지향적인 프로그래밍이라고 합니다.

클래스는 이 4가지의 특성 중 추상화를 뜻합니다.

자바에서 추상화란 현실의 객체를 분석하여 클래스로 정의하고, 해당 클래스를 메모리 내의 실체(인스턴스)로 구현하여 사용하는 것을 뜻합니다.

그렇다면 현실의 객체를 어떻게 클래스로 정의하면 좋을까요?

예를 들어봅시다.

친구들과 레고를 이용해 비행기를 만들어보기로 합니다. A 친구는 머리 B 친구는 몸통 C 친구는 날개 D 친구는 꼬리를 만들어 합치기로 합니다.

이렇게 만들어진 비행기는 각각이 머리, 몸통, 날개, 꼬리로 모듈화가 되어 잘 만들어진 날개는 떼서 재사용할 수 있을 뿐만 아니라 결함이 있는 날개는 날개만 떼서 다른 날개로 쉽게 교체가 가능합니다.

자바도 마찬가지로 모듈화를 통해 클래스를 만들면 쉽게 추가/삭제/수정이 쉽고 재사용이 가능하게 됩니다. 이렇게 모듈화를 통해 만들 객체(제품)의 설계도를 클래스라고 하고 설계도를 통해 만들어진 제품이 인스턴스입니다.

 

클래스와 인스턴스의 생성


public class hyuni {

	public static void main(String[] args) {
        // 인스턴스 생성 기본 문법
        // 클래스명 참조변수명 = new 클래스명();
		Student s = new Student(); // 인스턴스 생성
       		s.id = 20101111
        	s.name = "홍길동"	
	}

}
// Student 클래스의 정의
class Student {
	int id;
	String name;
	String className;
}

클래스는 이클립스의 기능 또는 직접 코드를 작성하여 정의할 수 있습니다.

정의된 클래스는 new 연산자를 통해 Heap 영역에 인스턴스를 생성합니다.

Heap 영역에 저장된 변수(참조 변수)는 인스턴스를 찾아가기 위한 주소가 저장되어 있습니다.

 

메서드


메서드란 클래스 내에서 정의되어 작업을 실행하는 코드들의 모음을 뜻합니다.

메서드의 형태로는 총 4 가자 있습니다.

< 메소드 형태 4가지 >

1. 파라미터도 없고, 리턴 값도 없는 메소드

2. 파라미터는 없고, 리턴 값만 있는 메소드

3. 파라미터만 있고, 리턴 값은 없는 메소드

4. 파라미터도 있고, 리턴 값도 있는 메소드

 

[제한자] 리턴타입 메소드명(파라미터...) {
     // 메소드 호출 시 수행할 코드들...
	return [리턴값];
}
ex)
public void hello(){
     system.out.println("Hello World");

제한자에는 public, protected, default, private 4가지 종류가 있으며 메서드에서는 보통 public이 많이 사용됩니다.

리턴 타입에는 void(리턴 타입 없음), int, long, double, String, class 등등이 올 수 있습니다.

파라미터는 메서드 호출 시 메소드에 전달해 줄 값을 의미합니다. 0개부터 무한대까지 올수 있습니다.

 

생성자


클래스를 생성하고 인스턴스를 생성할 때 클래스의 변수들을 인스턴스 생성과 동시에 초기화하는 것을 뜻합니다.

 < 생성자 정의 기본 문법 >
[접근제한자] 클래스명([파라미터변수선언...]) {
     // 생성자 호출 시점(인스턴스 생성 시점)에 수행할 작업들(= 인스턴스 변수 초기화 등)
}

 

오버 로딩


메소드 오버 로딩(Method Overloading) = 메소드 다중 정의

  • 동일한 이름의 파라미터가 다른 메서드를 여러 번 정의하는 것
  • 동일한 기능을 수행하지만, 전달받는 파라미터가 달라야 할 경우

메소드 이름을 각각 따로 지정해야 하지만, 오버 로딩을 사용하여 정의하면

메소드 이름을 동일하게 정의하고 파라미터만으로 각각의 메소드를 구별할 수 있게 합니다

주의사항! 메서드 시그니처(이름, 리턴 타입, 파라미터, 접근 제한자) 중에서

파라미터를 제외한 나머지는 동일하게 정의함

=> 외부에서 호출할 때 메서드 파라미터(소괄호()) 데이터만으로 각 메소드를 구분하도록 함

< 메소드 오버 로딩 규칙(택 1) >

1. 메소드 파라미터의 타입이 달라야 함

2. 메소드 파라미터의 개수가 달라야 함

오버 로딩 기본 문법


class OverloadingClass {
	// 두 수를 전달받아 덧셈 결과를 출력하는 메소드 정의
	// 1. 정수 2개를 전달받아 덧셈
	public void add(int num1, int num2) {
		System.out.println(num1 + num2);
	}
	// 2. 실수 2개를 전달받아 덧셈
	// => int형 파라미터 2개를 전달받는 메소드 add() 와 모두 동일하고 파라미터 타입만 다름
	//    파라미터 갯수가 동일하더라도 타입이 달라지므로 오버로딩 성립됨
	public void add(double num1, double num2) {
		System.out.println(num1 + num2);
	}
	
	// 3. 정수 3개를 전달받아 덧셈
	// => add(int, int) 메소드와 파라미터 갯수가 달라지므로 오버로딩 성립됨
	public void add(int num1, int num2, int num3) {
		System.out.println(num1 + num2 + num3);
	}
	
}

 

오버로딩 예시


package hyuni;


  public class ClassEx {


public static void main(String[] args) {

// < 인스턴스 생성 기본 문법 >
// 클래스명 참조변수명 = new 클래스명();
// new 키워드를 통해 인스턴스가 Heap 공간에 생성되고
// 참조변수에 생성된 인스턴스 주소가 저장됨

    Account acc = new Account(); //인스턴스 생성 기본 문법

    System.out.println("--------------------------------");

    Account acc2 = new Account("111-1111-111", " hyuni", 100000);
    System.out.println("계좌번호 : " + acc2.getAccountNo());

    System.out.println("--------------------------------------");

    acc2.withdraw(50000); //메소드 접근 방법 = 참조변수명.메소드이름

    System.out.println("---------------------------------------");

    acc2.accountPrint();

    System.out.println("--------------------------------------");

    acc2.withdraw(50000);

    System.out.println("--------------------------------------");

    acc2.withdraw(100000, true); //마이너스 통장 메소드
    acc2.withdraw(100000, false); //폴스 일 때 잔액 부족

  }


}


class Account { // 계좌 클래스의 선언

  private String accountNo; // 접근제한자 = public, private, default(기입안할시) 등등
  private String ownerName; // private 쓰면 다른 클래스에서 바로 접근 불가능(캡슐화)
  private int money;

  public Account() { // alt + shift + s + o 를 통해 생성자 오버로딩을 자동으로 생성 할 수 있음.

    // 이와 같은 형태가 디폴트 생성자
    // 디폴트 생성자는 자바에서 자동으로 만들어 주지만 생성자 오버로딩을 하면 디폴트 생성자를 만들어 줘야 함.
    this("111-1111-111", "Hyuni", 10000); // this() 중복을 줄이기 위해 상위 생성자를 호출하여 초기값을 정해 줄 수 있다.
    System.out.println("디폴트 생성자 입니다.");
  }


  public Account(String accountNo, String ownerName, int money) {

    // 생성자 오버로딩 기본 형태
    // 오버로딩은 파라미터의 갯수 또는 변수가 달라야함
    // 생성자 오버로딩을 함으로서 초기값을 만들어 줄 수 있음.

    this.accountNo = accountNo; // this = 자기자신 즉 인스턴스로 만들어 졌을 때 자기자신의 변수를 가리킴.
    this.ownerName = ownerName; // 즉 좌변은 Account클래스의 멤버 변수 이며 우변은 파라미터값 즉 전달 받은 값이다.
    this.money = money;

  }


  public String getAccountNo() {

    // 캡슐화를 통해 다른 클래스에서 계좌클래스의 멤버 변수로의 접근이 불가능 하기 때문에
    // Getter, Setter 메소드를 통해 접근 가능 하게 한다.
    // 마찬가지로 alt + shift + s + r 로 자동생성 할 수 있다.

    return accountNo;

  }
  

  public void setAccountNo(String accountNo) {
    this.accountNo = accountNo;
  }

  public void accountPrint() {

    // 메소드 기본 형태
    // 다른 클래스 에서 인스턴스 생성 후 참조변수를 통해 접근 가능한 메소드(함수)
    // 아래 문장을 바로 출력해줌

    System.out.println("계좌번호 : " + accountNo);
    System.out.println("예금주명 : " + ownerName);
    System.out.println("계좌잔액 : " + money);
}

public void withdraw(int money) {
    // 출금 메소드
    // if (this.money > money) { // 계좌잔액이 출금 금액 보다 많을 때
      // this.money -= money; // 계좌잔액 this.money 에서 출금금액 money를 뺀다
      // System.out.println("출금금액 : " + money); // 출금 금액 출력
      // System.out.println("남은금액 : " + this.money); // 남은 금액 출력
    // } else { // 계좌 잔액이 출금 금액보다 작을 때
  // System.out.println("잔액이 부족합니다.");
// }
// ---------------------------------------여기 까지 중복 코드 입니다.
=> 오버로딩된 메소드를 호출함으로써 코드를 절감할 수 있습니다.
withdraw(money, false); // 메소드 오버로딩
}

public void withdraw(int money, boolean minus) {

// 출금 메소드 오버로딩 마이너스 통장 기능

  if (minus == true) { // 마이너스 통장 트루 일때 계좌잔액이 부족해도 무조건 출력

    this.money -= money; // 계좌잔액 this.money 에서 출금금액 money를 뺀다
    System.out.println("출금금액 : " + money); // 출금 금액 출력
    System.out.println("남은금액 : " + this.money); // 남은 금액 출력
  } else { // 마이너스 통장 폴스 일 때 다시 금액 검사 후 출력
  if (this.money > money) { // 계좌잔액이 출금 금액 보다 많을 때
    this.money -= money; // 계좌잔액 this.money 에서 출금금액 money를 뺀다
    System.out.println("출금금액 : " + money); // 출금 금액 출력
    System.out.println("남은금액 : " + this.money); // 남은 금액 출력
    } else { // 계좌 잔액이 출금 금액보다 작을 때
      System.out.println("잔액이 부족합니다.");
      }
    }
  }
}

결과 출력

 

반응형

'Programming > Java' 카테고리의 다른 글

자바 상속과 오버라이딩  (0) 2021.01.06
자바 싱글톤 패턴, 싱글톤 패턴 예시  (0) 2021.01.06
자바 배열(Array)  (0) 2021.01.05
자바 for문, for문 구구단 출력  (0) 2021.01.05
자바 if문, if문 예시  (0) 2021.01.05

댓글