[JAVA]클래스

홍준표·2022년 6월 29일
0

java 스터디

목록 보기
5/8

목표

자바의 Class에 대해 학습하세요.


학습할 것

  • 클래스 정의하는 방법
  • 객체 만드는 방법(new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

과제 (Optional)

  • int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.
  • int value, Node left, right를 가지고 있어야 합니다.
  • BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.
  • DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.

클래스 정의하는 방법

클래스란?

객체를 정의해놓은 것으로 객체를 생성하는데 사용된다.

여기서 객체란 '실제 존재하는 것'으로 지금 이 포스팅을 작성하는 키보드부터 책상, 컴퓨터, 의자 등의 사물들이 객체라고 할 수 있다. 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 의미한다.

  • 유형의 객체: 책상, 의자
  • 무형의 객체: 수학공식, 프로그램 논리 및 개념

객체와 클래스의 관계를 실행활에 비유를 하자면 제품 설계도와 제품의 관계로 볼 수 있다. TV 설계도는 TV를 정의한 것으로 TV를 보기위해서는 설계도가 아니라 TV가 필요한 것처럼 클래스도 객체를 만드는데만 사용된다. 그리고 객체는 클래스를 통해 생성한 다음에야 사용 가능하다.

이처럼 클래스를 선언해두면 그 이후 필요할 때마다 해당 클래스를 통해 객체를 생성해 사용할 수 있다. 클래스는 객체를 정의하기 위한 상태(멤버변수)와 메소드(함수)로 구성된다.

클래스를 정의하는 방법

작성규칙

  • 하나 이상의 문자로 이뤄져야 한다.
    • Car, SportsCar
  • 첫 번째 글자는 숫자가 올 수 없다.
    • 3Car
  • $,_ 외의 특수 문자는 사용할 수 없다.
    • @Car, #Car
  • 자바 키워드는 사용할 수 없다.
    • int, for

클래스의 정의 과정

1. 소스파일 생성
: 적절한 위치에 원하는 클래스이름.java 로 소스 파일을 생성해준다.
(이 때 클래스 이름은 작성 규칙을 지켜주도록 한다.)

2. 클래스에는 객체에 필요한 구성들을 선언해준다

package me.catsbi.study.step5;

public class 클래스이름 {
    private String 필드;

    public 클래스이름() { } // 생성자

    public void 메소드(){
        ...
    }
}
  • 필드
    : 객체의 데이터가 저장됩니다. 필드에 들어가는 변수들은 다양한 타입을 제공하며 더 자세한 내용은 2주차 자바 데이터 타입, 변수 그리고 배열 에서 확인 가능합니다.
  • 생성자
    : 객체 생성시 초기화를 진행하며 생성된 객체를 반환합니다. 하나의 설계도(클래스)를 통해 여러 객체를 만들 때 필요한 정보들을 인수로 받아서 객체를 생성해 사용할 수 있도록 합니다.
  • 메소드
    : 객체의 동작을 선언하는 블록으로 메소드를 호출하면 중괄호 내의 코드가 수행되며 적절항 행동을 취합니다.

예제:: 자동차 클래스 정의하기

package me.catsbi.study.step5;

public class Car {
    private String manufacturer;
    private String name;
    private long price;
    private int numberOfWheel;

    public Car(String manufacturer, String name, long price, int numberOfWheel) {
        this.manufacturer = manufacturer;
        this.name = name;
        this.price = price;
        this.numberOfWheel = numberOfWheel;
    }

    public Car() { }

    public void go(){
        System.out.println("앞으로 전진합니다.");
    }

    public void stop(){
        System.out.println("멈춥니다.");
    }
}

객체 만드는 방법 (new 키워드 이해하기)

Car car = new Car();

설계도(클래스)를 작성했다면 이제 설계도를 통해 객체를 생성할 수 있습니다.

Java의 new 키워드는 클래스의 인스턴스를 만드는데 사용됩니다. 즉, 새 객체에 대한 메모리를 할당하고 해당 메모리에 대한 참조를 반환하여 클래스를 인스턴스화 합니다.

new keyword 특징

  • 객체를 만드는데 사용됩니다.
  • 런타임에 메모리를 할당합니다.
  • 모든 객체는 힙 영역에서 메모리를 차지합니다.
  • 객체 생성자를 호출합니다.
  • 생성자를 호출하려면 단일 후위 인수가 필요합니다.

메소드 정의하는 방법

접근제어자 리턴타입 메소드명(파라미터){
   // 실행할코드
   return 리턴타입;
} 

메소드는 기본적으로 리턴타입과 메소드 명만 있어도 정의가 가능함

접근제어자

접근제어자같은 클래스의 멤버같은 패키지의 멤버자식 클래스의 멤버그외의 영역
publicoooo
protectedooo
defaultoo
privateo

메소드를 정의할 때 중요한 기법이 있는데 바로 메소드 오버로딩과 메소드 오버라이딩이다.
자바의 객체지향의 특징인 다형성을 이용한 방법으로 코드의 변경과 확장을 용이하게 해주는 자바의 대표적인 특징이다.

메소드 오버로딩(Method Overloading)

메소드 오버로딩은 파라미터의 갯수나 타입이 다르다면 동일한 이름의 메소드명을 사용해 메소드를 정의할 수 있는 기법이다.

매개변수는 동일하고 리턴타입이 다른 경우에는 메소드 오버로딩이 성립하지 않는다.

예를 들면, System.out.println()이 대표적인 메소드 오버로딩 기법 중 하나이다.

//메소드 오버로딩
public String getName() {...}
public String getName(int age) {...}

//대표적인 메소드 오버로딩
System.out.println("바이에른 뮌헨");
System.out.println("1900);

메소드 오버라이딩(Method Overriding)

메소드 오버라이딩은 상위 클래스가 정의한 메소드를 하위 클래스가 가져와 변경하거나 확장하는 기법, 즉 하위 클래스에서 메소드를 재정의하는 기법이다.

class Person {
	public void info() {
		System.out.println("사람입니다");
	}
}

class Adult extends Person {
	@Override
	public void info() {
		System.out.println("어른입니다.");
	}
}

class Child extends Person {
	@Override
	public void info() {
		System.out.println("어린이입니다.");
	}
}

Person person = new Person();
Adult adult = new Adult();
Child child = new Child();

person.info();     //사람입니다.
adult.info();      //어른입니다.
child.info();      //어린이입니다.

메소드 오버라이딩은 상위 클래스의 메소드를 하위 클래스에서 메소드를 재정의하기 때문에 확장과 변경에 용이하다는 장점이 있다.

생성자 정의하는 방법

변수를 선언하고 초기화하는 것과 마찬가지로 클래스를 생성하고 객체를 호출할 때 객체를 초기화 하기 위해 사용되는 것이 생성자이다.

생성자는 기본 생성자, 묵시적 생성자, 명시적 생성자로 구분된다.

  1. 기본 생성자 : 클래스 내부에 선언된 생성자가 없는 경우 객체 생성 시에 컴파일러가 자동으로 추가해주는 생성자이다.

  2. 묵시적 생성자 : 파라미터 값을 가지지 않는 생성자이다.

  3. 명시적 생성자 : 파라미터 값을 가지는 생성자이다.

class Person() {...} -> 기본 생성자 호출 
class Person() {
	//묵시적 생성자
	public Person() {
		System.out.println("생성되었습니다.");
	}
	
	//명시적 생성자 
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
} 

생성자는 몇가지 특징을 가지고 있다.

  • 생성자는 리턴 타입을 가지지 않는다.

  • 생성자는 클래스 이름과 동일하다.

  • 모든 클래스는 생성자가 반드시 존재하고, 한개 이상의 생성자를 가진다.

  • 클래스 내부에 생성자를 선언하지 않으면 컴파일러가 기본 생성자를 선언해 사용한다.

  • 명시적 생성자만 선언되있는 경우 파라미터가 없는 생성자를 사용하고 싶다면 묵시적 생성자를 선언해주어야한다. (생성자가 클래스 내부에 선언되어 있기 때문에 기본 생성자가 생성되지 않는다.)

this 키워드 이해하기

this 키워드는 클래스가 인스턴스화 되었을때 자기 자신의 메모리 주소를 가지고 있다.

즉, 자기 자신을 나타내는 키워드라고 생각하면 된다. 또한, 클래스 내부의 필드 이름과 메소드를 통해 넘어온 파라미터의 변수명이 동일한 경우 this키워드를 이용해 클래스 내부의 필드이름과 파라미터를 구분해준다.

class Person {
	private String name;
	public Person(String name) {
		this.name = name;   // 클래스 필드 name = 파라미터 name
	}
}

this()클래스 내부에서 생성자를 호출한다.

this()의 경우 호출하는 곳의 첫 번째 문장에서 호출되어야 한다. 생성자가 파라미터가 있는 경우 this()안에 생성자 파라미터 타입에 맞게 직접 입력하여 사용할 수 있다.

class Person {
	private String name;
	public Person(String name) {
		this.name = name;   // 클래스 필드 name = 파라미터 name
	}
	
	public Person(String name)
		this(name+"입니다");
	}
}
profile
프로그래밍 시작

0개의 댓글