본문 바로가기
JAVA

[클래스] 객체지향 코딩 & 생성자

by amoomar 2022. 1. 1.
반응형

 

 

이번 포스팅은 객체지향의 개념과 클래스의 선언 및 사용, 생성자 대한 내용에 대해 다루었다.

 

 


 

 

1. 절차지향과 객체지향

 

1) 절차지향

: 대표적으로 python, C언어가 있으며, 알고리즘과 자료구조를 만드는데 특화되어있다. 

(ex. 빵 생산(반죽-발효-굽기-장식-포장)과 같이 이전 로직이 끝나야만 다음 단계가 진행 가능하다.)

 

2) 객체지향

: Java의 언어지향으로, 만들어진 자료구조를 사용하는데 목적이 있다.

객체지향언어는 아래의 4가지의 특징을 지니고 있다.

 

  1. 추상화 : 설계에 초점이 맞춰져 있다. 틀을 정의해주면 그에 맞춰 다양한 Output을 낼 수 있다.(엡스트랙, 임플리먼트)
  2. 캡슐화(2-1 정보은닉) : 용법을 알면 정확히 이용이 가능하다. 타인의 메서드를 가지고 다른걸 만들 수 있다는 의미이고, 이것은 즉 재사용의 개념이라고 할 수 있다. 재사용은 개발시간과 검사시간이 단축되는 이점이 있다.
  3. 상속 : 부모클래스의 것을 자식클래스가 별도 선언, 구현 없이 사용가능하게 하는 방법이다.(extends : 부모의 기본생성자를 기본으로 불러오기에 그로인한 문제가 발생할 가능성이 있다.)
  4. 다형성 : 함수에 주어가 있다고 할 수 있다. 객체가 함수를 사용하고, 누가 사용하는가에 따라 결과가 다르다.
    동일함수 (메서드) 실행시에도 인자에 따라 각각 다른 결과를 볼 수 있는 Overloading과, 재정의 한 후 그 재정의 된 값을 결과로 볼 수 있는 Overriding이 있다.

 

3) Overloading과 Overriding의 차이

Overloading Overriding
- 상속이 불가능하다
- 메서드 시그니처(인풋, 이름, 아웃풋 등)가 다르다
- 함수명 중복정의가 허용된다
- 상속이 가능하다
- 메서드 시그니처가 같아야한다
- 메서드를 재정의한다

 

 


 

 

2. 클래스

: 일반적으로 공통 요소가 분명하지만, 자료형이 달라 배열로 만들 수 없을때 클래스를 활용한다.

 

1) 선언

// 클래스의 구성
class 클래스명{
    멤버변수
    멤버메서드
}

// 예시
class Student{
	//멤버변수
	String name; 
	int score;
    
	//멤버메서드
	void show(){
    	system.out.println("제 이름은 "+ name + "이구요, 점수는 " + score + "점 입니다.")
    }
}

 

: 대괄호 내부를 필드라고 한다.

 

 


 

 

2) 객체화(초기화)

: 인스턴스화라고도 한다. 추상적인 개념을 실제화시키는 목적이며, 클래스타입의 객체를 생성하고 그 객체로 하여금 접근하는 방식이다.

 

MAIN{
//객체화를 먼저 진행한 후 사용한다.
클래스명 객체명= new 클래스명();
//스캐너의 초기화와 유사한 형태이나, 클래스의 경우 객체화라고 칭한다.

객체명.필드;
//stu1.Student안의 필드들을 사용가능하다;
}
main{
Student stu1 = new Student();
stu1.show();
}

 


 

3) 생성자와 기본생성자

초기화의 목적이 있다. 메서드와 같은 기능을 하지만 return과 return type은 존재하지 않으므로 메서드라고 칭하지 않는다.  클래스를 선언하면 자동으로 생성되는 생성자는 기본생성자라고 하며, 생성자를 새로 만들면 그것은 생성자가 된다.

 

 

① 기본생성자

 : 디폴트 생성자라고도 하며, 일반적인 경우 생략되어있지만 main에서 클래스를 객체화 하는 순간 존재한다.

 

class Student{
	String name;
	int score;
	
    Student(){ -> 기본생성자, 생략되어있지만 클래스를 객체화하는 순간부터 존재해있다.
    }
    
	void show(){
 	system.out.println("제 이름은 " + name + "이구요, 점수는 " + score + "점 입니다.")
	}
}
main{
	Student stu1 = new Student(); //기본생성자를 사용
	stu1.name = "왕대박"
	stue1.score = 100

	stu1.show();
}

 

② 생성자

 : 사용자가 직접 만든 생성자를 기본생성자가 아닌 생성자라고 한다. 인자가 존재하는 순간 그냥 생성자가 된다.

인자가 있는 경우 객체화 진행시 인자를 필수로 넣어야한다.

class Student{
	String name;
	int score;
	
    Student(String name, int score){ //생성자
    	this.name = name;
        this.score = score;
    }
    
	void show(){
 	system.out.println("제 이름은 " + name + "이구요, 점수는 " + score + "점 입니다.")
	}
}
main{
	Student stu1 = new Student("왕길동", 98); //생성자를 통해 객체화
	stu1.show();
}

 

 


 

 

4) 생성자 오버로딩

 

: 생성자에게서 오버로딩 현상이 많이 일어나는 것을 붙여 표현한 것이다.

보편적으로 객체화 할 때 마다 인자를 다르게 받고싶은 경우 여러개의 생성자를 생성한다.

 

class Point {
	String name;
	int x;
	int y;
	//생성자1
	Point(String name){//이름만 입력하면 점이 자동으로 0
	this.name = name;
      	this.x = 0;
        this.y = 0;
	}
	//생성자2
	Point(String name, int x){//이름, x점만 입력하면 y는 자동으로 10
	this.name = name;
        this.x = x;
        this.y = 10;
	}
	//생성자3
	public Point(String name, int x, int y) {//셋 다 입력해야하는 생성자
	this.name = name;
		this.x = x;
		this.y = y;
	}
}
public class Test01 {
	public static void main(String[] args) {
		Point p1 = new Point("홍낄똥");
		Point p2 = new Point("티모", 10);
		Point p3 = new Point("아리", 1, 2);
	}
}

 

위처럼 받고싶은 인자가 달라 여러개의 생성자를 선언하는 경우 인자가 가장 많은 생성자만 두고 아래와 같이 생략하여 표현이 가능하다. *생성자 선언 단축키 : alt + S + O*

 

class Point {
	String name;
	int x;
	int y;
	//생성자1
	Point(String name){//이름만 입력하면 점이 자동으로 0
	this(name, 0, 0);
	}
	//생성자2
	Point(String name, int x){//이름, x점만 입력하면 y는 자동으로 10
	this(name, x, 10);
	}
	//생성자3
	public Point(String name, int x, int y) {//셋 다 입력해야하는 생성자
		this.name = name;
		this.x = x;
		this.y = y;
	}
}
public class Test01 {
	public static void main(String[] args) {
		Point p1 = new Point("홍낄똥");
		Point p2 = new Point("티모", 10);
		Point p3 = new Point("아리", 1, 2);
	}
}

 

 


 

 

3. 예제

 

객체 생성시 이름과 x좌표, y좌표를 각각 입력하면 show라는 메서드를 통해 이름과 현재 좌표를 조회할 수 있다. 단, 이름만 적는다면 각 점은 자동으로 0으로 설정되고, 이름과 x점만 입력하면 y점은 자동으로 10이 설정된다. move라는 이름의 메서드로 입력된 수 만큼 점 이동이 가능하나, 입력을 하지 않으면 1칸씩 이동하는 프로그램을 코딩하라.

 

package class04;

class Point {
	String name;
	int x;
	int y;

	Point(String name){
		this(name, 0, 0);
	}
	Point(String name, int x){
		this(name, x, 10);
	}
	public Point(String name, int x, int y) {
		this.name = name;
		this.x = x;
		this.y = y;
	}
	void show() {
		System.out.println(name + "님의 점은 (" + this.x + ", " + this.y + ")");
	}
	void move() {
		this.x ++;
		this.y ++;
		System.out.println(this.name +" ("+ this.x + ", " + this.y + ")");
	}
	void move(int num) {
		this.x += num;
		this.y += num;
		System.out.println(this.name +" ("+ this.x + ", " + this.y + ")");
	}
}
public class Test01 {
	public static void main(String[] args) {
		Point p1 = new Point("홍낄똥");
		Point p2 = new Point("티모", 10);
		Point p3 = new Point("아리", 1, 2);

		p1.show();
		p2.show();
		p3.show();

		p1.move();
		p2.move(100);
	}
}

반응형

'JAVA' 카테고리의 다른 글

[상속] 상속과 Overriding  (0) 2022.01.01
[클래스] 제어자 & 필드의 구분  (0) 2022.01.01
[알고리즘] 퀵정렬  (0) 2021.12.31
[알고리즘] 버블정렬 & 이진탐색  (0) 2021.12.31
[메소드] 함수 & 재귀호출  (0) 2021.12.27