자바

자바1- 객체지향과 클래스의 기본 개념

토리쟁이 2022. 7. 21. 05:41

자바를 잘하는 기준은 단순히 알고리즘을 잘 짜는 것이 아니라, 자바라는 언어의 특징을 완전히 이해하고 객체지향을 적극적으로 활용하여 프로그램을 짤 수 있는지에 달려있다.

이 자바 카테고리에서는 단순히 알고리즘을 짜기 위한 자바 문법을 다루기보다는 객체 지향의 특성을 살린 학습을 해보려고한다.

대체 객체 지향 언어를 사용하면 무엇이 좋을까?

==> 소프트웨어의 생산성 향상, 실세계에 대한 쉬운 모델링

 

객체 지향 언어의 특징)

 

 

 

그럼 제일 먼저 클래스와 객체에 대하여 알아보도록 하자.

 

객체란, 자신만의 고유한 특성과 행동을 가지며 다른 객체들과 상호 작용을 하면서 존재한다.

객체 지향 언어인 자바는 이러한 객체를 프로그램 내에 표현하기 위해 클래스와 객체 개념을 도입하였다.

클래스란, 객체를 만들어 내기 위한 설계도 or 틀을 말한다.

클래스로 객체를 만들어내면, 객체를 클래스의 인스턴스라고 한다.

객체들은 클래스의 모양대로 모두 동일한 속성을 가지고 탄생하지만, 자신만의 고유한 값을 가진다.

 

public class Circle{	// 원 클래스
    public int radius;
    public String name;
    
    public Circle(){ // 원의 생성자 메소드
    
    }
    public double getArea(){	// 면적 계산 메소드
    	return 3.14*radius*radius;
    }
    
}

위의 예시는 클래스가 어떻게 구성되어 있는지 알아보기 위한 코드이다.

클래스는 class 클래스 이름{} 을 선언하고 {}안에 필드와 메소드를 작성하는 방식이다.

하나하나 뜯어 살펴보자.

 

맨 윗줄의 public은 접근 지정자의 한 종류이다.

객체 지향 언어는 정보은닉 특징이 있다는 것을 기억하는가?

접근 지정자로 인해 이 특징이 생긴 것이다.

어떤 접근 지정자를 쓰냐에 따라서 정보 공개 범위가 달라진다.

여기서 public은 해당 클래스를 다른 클래스에서 활용하거나 접근할 수 있음을 선언한다.

public 말고도 private, protected, 디폴트가 있지만 나중에 다루도록 하자.

 

클래스 괄호 안에서 정의된 변수는 해당 클래스의 멤버 변수이며, 필드라고 부른다.

아래 부분에는 함수도 있는데 이는 객체의 행동을 구현하는 부분이다.

 

중간에 있는 public Circle(){}은 해당 클래스의 생성자로, 생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메소드이다. 클래스의 이름과 동일하게 메소드를 생성하면 된다.

클래스 생성시 굳이 작성하지 않아도 된다.(자동으로 숨겨서 작성되어 있음)

그럼 생성자는 어떤 역할을 할까?

===> 생성자는 객체가 생성될 때 초기화나 필요한 작업을 할 수 있다.

원 클래스의 생성자에는 아무 코드도 작성되지 않았기 때문에 객체 생성시 아무 작업이 실행되지 않는다.

(기본 생성자: 아무 일도 하지 않고 단순 리턴하는 생성자)

위에서 작성한 원 클래스의 객체를 생성하고 활용해보자.

public class ex01 {

	public static void main(String[] args) {
		Circle pizza;	// Circle 객체 변수 선언
		pizza = new Circle();	// Circle 객체 생성
		
		pizza.radius=10;	// 피자의 반지름 필드에 10 저장
		pizza.name = "자바피자";
		double area = pizza.getArea(); // 클레스 안의 함수 호출하여 면적 구하기
		
		System.out.println(area);

	}

 

이처럼 클래스로부터 만들어낸 객체에 접근할 때는 객체명.멤버변수(또는 함수)로 접근할 수 있다.

맨 처음에 Circle pizza; 를 작성하였는데, 여기서 피자는 객체를 생성하기 전 객체를 가리킬 레퍼런스 변수이다.

객체에 대한 주소만 가지는 변수일 뿐 객체 자체는 아직 생성되지 않은 것이다.

 

자바에서는 반드시 new 연산자를 사용하여 객체를 생성한다.

pizza = new Circle(); ==> 생성자 코드이며, 원 클래스에서의 생성자 메소드이다.

 

<생성자>

생성자를 더 자세히 알아보자.

생성자는 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드이다.

객체가 생성되는 순간에 자동으로 호출되므로, 객체에 필요한 초기화를 실행하는 코드를 작성한다.

	public Circle(int r, String n) {
		radius = r;
		name = n;
	}

 

기존에 있던 원 클래스의 생성자를 위와 같이 바꾸면 어떻게 될까?
생성자가 두 개의 매개변수를 받아 클래스의 멤버 변수를 해당 값으로 초기화 시켜준다.

그럼 여기 두 개의 매개변수는 어디서 받는가?

==> 메인 메소드에서 객체 생성시 적어주면 된다.

pizza = new Circle(1, "클래스피자");

이렇게 작성을 하면 반지름이 1인 클래스피자 객체가 만들어지는 것이다.

위 예시에서 생성자 함수는 되게 간단하지만, 실제로는 많은 규칙들이 존재한다.

 

생성자 함수 선언 및 활용 규칙)

1. 생성자의 이름은 클래스의 이름과 동일할 것

2. 생성자는 여러 개 작성(오버로딩)할 수 있다. 

단, 매개변수의 개수와 타입이 달라야한다. 

3. 생성자는 new를 통해 객체를 생성할 때 단 한 번만 호출된다.

4. 생성자에 리턴 타입을 지정할 수 없다.

=> 리턴 값이 없다고 해서, void를 지정하면 안된다! 그냥 아예 적지 말 것!! 

(단, return; 은 작성ㄱㄴ => 단순히 함수 끝내겠다는 의미)

5. 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.

6. 클래스에서 생성자를 쓰지 않았을 경우 컴파일러가 기본 생성자를 자동으로 생성해준다.

=> 단, 생성자가 하나라도 존재할 경우에는 자동 생성 x

 

 

<this  레퍼런스>

this는 자바의 중요한 키워드로서 객체 자신을 가리키는 레퍼런스이다.

this가 굳이 왜 필요할까? 다음 예시를 봐보자.

	public Circle(int radius, String name) {
		radius = radius;
		name = name;
	}

클래스 내의 생성자 함수이다. 

클래스의 멤버 변수로 radius와 name이 있는데 매개변수로 똑같은 radius와 name을 받았다.

클래스의 멤버변수를 해당 매개변수 값으로 초기화해주고 싶은데 이름이 같으니 헷갈리지 않는가?

이를 방지하기 위해서, this를 사용한다.

	public Circle(int radius, String name) {
		this.radius = radius;
		this.name = name;
	}

this말고 this()도 있다.

this()는 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용하는 자바 코드이다.

생성자 코드에서만 호출할 수 있다.

반드시 같은 클래스 내의 다른 생성자를 호출할 때 사용된다.

반드시 생성자의 첫 번째 문장이 되어야 한다.

예시는 책을 참고할 것.