이번 포스팅은 객체지향의 개념과 클래스의 선언 및 사용, 생성자 대한 내용에 대해 다루었다.
1. 절차지향과 객체지향
1) 절차지향
: 대표적으로 python, C언어가 있으며, 알고리즘과 자료구조를 만드는데 특화되어있다.
(ex. 빵 생산(반죽-발효-굽기-장식-포장)과 같이 이전 로직이 끝나야만 다음 단계가 진행 가능하다.)
2) 객체지향
: Java의 언어지향으로, 만들어진 자료구조를 사용하는데 목적이 있다.
객체지향언어는 아래의 4가지의 특징을 지니고 있다.
- 추상화 : 설계에 초점이 맞춰져 있다. 틀을 정의해주면 그에 맞춰 다양한 Output을 낼 수 있다.(엡스트랙, 임플리먼트)
- 캡슐화(2-1 정보은닉) : 용법을 알면 정확히 이용이 가능하다. 타인의 메서드를 가지고 다른걸 만들 수 있다는 의미이고, 이것은 즉 재사용의 개념이라고 할 수 있다. 재사용은 개발시간과 검사시간이 단축되는 이점이 있다.
- 상속 : 부모클래스의 것을 자식클래스가 별도 선언, 구현 없이 사용가능하게 하는 방법이다.(extends : 부모의 기본생성자를 기본으로 불러오기에 그로인한 문제가 발생할 가능성이 있다.)
- 다형성 : 함수에 주어가 있다고 할 수 있다. 객체가 함수를 사용하고, 누가 사용하는가에 따라 결과가 다르다.
동일함수 (메서드) 실행시에도 인자에 따라 각각 다른 결과를 볼 수 있는 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 |