나는 원시인이기 때문에 학원에서 하라는데로 무작정 자바를 처음으로 배웠다.
자바를 왜 쓰는지, 선택한 이유, 특징을 전혀 1도 모르고 사용하고 있었는데
신입 개발자에게 묻는 단골 질문 중 하나라고 생각 하기 때문에 미리 대비 겸 원시인 뇌를 좀 채워 볼까 정리 하게 됐다.
첫 번째로
"자바의 특징에 대해서 말해보세요"
하면 누구나 다 처음 대답을
라고 말할 것이다.
만약 내가 나를 담당한 면접관이면 얘가 진짜 알고 대답하는건지 알수가 없다.
나는 항상 머리속으로는 "다들 그렇게 말하니까" 를 떠올린다.
먼저 객체 지향 언어에 대해서 알아보자
객체지향프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나인데, 컴퓨터 프로그램의 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 '객체'들의 모임으로 파악하고자 하는 것입니다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있습니다. 이러한 객체 지향 프로그래밍에서 사용하는 언어를 객체 지향 언어다.
"?"
OOP를 구성하기 위해서는 '객체'가 필수다.
실제 세상에서 사물의 개념을 프로그램에서는 객체라고 볼 수 있다. 사람으로 예를 들면 사람의 나이,주민번호 등 정보가 상태(state)다. 또한 먹고, 자고, 숨쉬는걸 행위(behavior)라고 한다.
객체 지향의 언어는 흔히 코드의 재사용과 유지보수를 올려준다고한다.
원시인인 나로써는 와닿지가 않는다.
객체 지향의 특징에는 4가지가 있는데
캡슐화 , 상속화, 다형성, 추상화
하나 씩 보도록 하자
클래스의 속성과 메소드를 하나의 캡슐로 묶어 외부에 노출하지 않는 것을 의미하는데,
예를 들어, 학생이라는 객체를 캡슐화를 한다면, 학생의 이름,학번,성적의 정보를 가지고 있는다. 이때 이름이나 학번를 외부에서 변경하지 못하도록 캡슐화하여 보호할 수 있는 것을 말한다.
외부에서 해당 학생의 속성을 바로 접근하거나 변경하거나 조회가 불가능하고 메소드를 통해서만 가능하게 하는 기술이다.
@Data
public class Student {
private String name;
private String id;
private int grade;
}
위 코드에서 name, id, grade 을 private 로 선언하여 외부에서 접근 할 수 없도록 하고 속성들을 조작하는 메소드를 public으로 선언해 외부에서는 메소드를 호줄하여 조작하도록 구현하는 것이다.
상속화는 이미 구현된 클래스에 대해서 코드를 재사용하고 새로운 클래스를 만들때 불필요한 중복을 줄이는 일을 말하는데,
예를 들어, 학생 클래스와 교수클래스를 만든다고 가정하면, 공통적으로 이름,나이 라는 속성이 있다. 이것을 학생과 교수 클래스에 두번 만드는건 가성비가 안나온다고 생각해서 만드는 것이다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
}
위와 같이 부모 클래스(Person)을 만들어 놓고 이것을 다른 클래스를 만들때 계속 해서 상속 받아서 쓰는 것이다.
public class Student extends Person {
private String major;
public Student(String name, int age, String major) {
super(name, age);
this.major = major;
}
public void introduce() {
super.introduce();
System.out.println("I am majoring in " + major + ".");
}
}
public class Professor extends Person {
private String field;
public Professor(String name, int age, String field) {
super(name, age);
this.field = field;
}
public void introduce() {
super.introduce();
System.out.println("I am teaching " + field + ".");
}
}
이렇게 상속하면 코드의 재사용성을 높힐수 있다.또 자식 클래스에서 부모 클래스의 메소드를 오버라이딩(편하게 재정의라고하자)하여 필요에 맞게 구현할 수도있다. 위 코드에서는 introduce()를 오버라이딩 하여 학생클래스에서 전공(major)을 교수 클래스에서는 담당분야(field)를 추가로 출력하도록 구현 하였다.
예시는 다른곳에서 긁어온것입니다.