※우선 이 글은 자바가 설치되어 있다는 가정하에 이클립스를 기반으로 작성합니다.
원래 군대를 가기 전에는 영단어에 대한 상식이 나쁘지는 않았던 것 같은데 전역하니까 기본 영단어들도 기억이 잘 안 나더라고요. 프로그래밍을 하면서 영어의 중요성이 뼈저리게 느껴져 슬슬 영어공부를 시작하려 합니다. 그 때문에 포스팅이 조금 짧아질 수도 있어요. 그렇지만 이 모든 것들이 프로그래밍을 위한 것이라는 것을 이해해주셨으면 좋겠습니다.
오늘 공부 순서는
1. 클래스란?
2. 상속이란?
3. 추상이란?
4. Final이란?
이렇게 구성되어 있습니다. 그럼 시작하겠습니다.
클래스란?
-클래스 : 1. 어떠한 실세계의 사물에 대해서 어떠한 성질들은 묶어서 정의해 놓은 것을 클래스라고 한다.
2. 객체 지향 프로그래밍 기법에서 가장 기본이 되는 특성이다.
3. 개발 프로젝트에서는 하나의 처리할 데이터 단위를 명시하는데 사용이 된다.
ex) 자동차 공장 Car라는 클래스라고 하면 이 클래스가 제작하는 사물은 속력, 색상, 이름, 연비 등 자동차의 특성을 가지고 있습니다. 이를 공장이라고 뜻 한 이유는 실제로 사용되는 자동차를 생성할 때 new Car();라고 변수를 생성하는데 이와 같이 데이터를 변수로 만들어서 사용할 수 있게 하는 것을 인스턴스화라고 합니다다.
인스턴스 : 클래스 안에서 만들어진 하나의 실제로 사용할 수 있는 단위.
자 이제 한번 실제로 굉장히 많이 사용된다는 Node클래스를 알아보겠습니다. 어려운 말이 아니라 그냥 점, 교점 등과 같은 의미입니다. 이번에는 두 점의 중점을 구하는 프로그램을 코드로 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public class Node {
private int x; //자바의 객체 지향 프로그래밍에서는 보안을 굉장히 중요시 하기때문에
private int y; //외부에서 함부로 바꿀 수 없도록 private로 선언
//x, y 값을 가져오기 위해서는 따로 함수를 만들어서 외부에서 접근할 수 있도록 한다.
//get은 그 값을 가져온다는 뜻. set은 값을 설정해 준다는 뜻.
public int getX() {
return x;
}
public void setX(int x) { //반환값이 없기 때문에 반환타입은 void
this.x = x; //private int x에 매개변수 int x를 넣는다는 뜻
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
//생성자 : 인스턴스 즉, 객체를 만들어줄 때 자동으로 값을 초기화 해주는 함수. 클래스와 동일한 이름을 가진다.
public Node(int x, int y) {
this.x = x;
this.y = y;
}
//다른 Node를 매개변수로 받아서 자신의(x, y)좌표와 다른 Node의 (x, y)좌표의 중앙 값을 반환하는 메소드
public Node getCenter(Node other) { //반환타입이 Node -> (x, y)좌표를 반환
return new Node((this.x+ other.getX()) / 2, (this.y+ other.getY()) / 2);
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("첫번째 점의 x좌표와 y좌표를 입력하시오. :");
Node one = new Node(s.nextInt(), s.nextInt()); //Node 생성자 값에 들어간다.
System.out.print("두번째 점의 x좌표와 y좌표를 입력하시오. :");
Node two = new Node(s.nextInt(), s.nextInt());
Node result = one.getCenter(two); //Node other값에 two가 들어간다.
System.out.println("x : " + result.getX() + ", y : " + result.getY());
}
}
|
cs |
익숙지 않은 문법들이 눈에 보여서 그렇지 막상 설명을 천천히 읽어보시면 헷갈리면서도 그렇게까지 어렵지는 않다는 느낌이 드실 겁니다. +) 물론 이해가 안 된다고 해서 이상한 것은 아니니까 다른 분의 설명이나 제 포스팅을 한번 더 읽어주세요.
상속이란?
-상속 : 자신의 부모 클래스가 가지고 있는 변수 및 메소드들의 특성을 물려받는 것.
-> 장점 : 불필요한 코드의 수를 줄일 수 있어 효율적인 개발 가능.
ex) 사람 -> 이름, 나이, 키, 몸무게 등으로 구성되어있다. 이를 class Person이라 한다.
-> Person을 Student, Salesman 등으로 분류하여 클래스를 만들어서 Person의 특성을 물려받는다.
-> Student, Salesman 클래스는 Person의 특성 + 자신의 특성으로 구성된다.
코드로 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public class Person {
private String name;
private int age;
private int height;
private int weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Person(String name, int age, int height, int weight) {
super(); //자신의 부모클래스의 생성자를 실행하겠다는 뜻
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
public class Student extends Person {
private String studentID;
private int grade;
private double credit;
public String getStudentID() {
return studentID;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
//개발의 편의성을 위해서 자신이 상속받은 클래스의 변수도 초기화.
public Student(String name, int age, int height, int weight, String studentID, int grade, double credit) {
super(name, age, height, weight); //자신의 부모가 가지고있는 생성자를 실행.
this.studentID = studentID;
this.grade = grade;
this.credit = credit;
}
public void show() {
System.out.println("------------------------");
System.out.println("학생 이름 : " + getName());
System.out.println("학생 나이 : " + getAge());
System.out.println("학생 키 : " + getHeight());
System.out.println("학생 몸무게 : " + getWeight());
System.out.println("학생 학번 : " + getStudentID());
System.out.println("학생 학년 : " + getGrade());
System.out.println("학생 학점 : " + getCredit());
System.out.println();
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
public class Salesman extends Person {
private String SalesmanID;
private String monthSalary;
private String jobGrade;
public String getSalesmanID() {
return SalesmanID;
}
public void setSalesmanID(String salesmanID) {
SalesmanID = salesmanID;
}
public String getMonthSalary() {
return monthSalary;
}
public void setMonthSalary(String monthSalary) {
this.monthSalary = monthSalary;
}
public String getJobGrade() {
return jobGrade;
}
public void setJobGrade(String jobGrade) {
this.jobGrade = jobGrade;
}
//개발의 편의성을 위해서 자신이 상속받은 클래스의 변수도 초기화.
public Salesman(String name, int age, int height, int weight, String salesmanID, String monthSalary, String jobGrade) {
super(name, age, height, weight); //부모가 가지고 있는 생성자 실행.
SalesmanID = salesmanID;
this.monthSalary = monthSalary;
this.jobGrade = jobGrade;
}
public void show() {
System.out.println("----------------------------");
System.out.println("회사원 이름 : " + getName());
System.out.println("회사원 나이 : " + getAge());
System.out.println("회사원 키 : " + getHeight());
System.out.println("회사원 몸무게 : " + getWeight());
System.out.println("회사원 인증번호 : " + getSalesmanID());
System.out.println("회사원 월급 : " + getMonthSalary());
System.out.println("회사원 직급 : " + getJobGrade());
System.out.println();
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
|
public class PersonMain {
public static void main(String[] args) {
Student student1 = new Student("김주호", 23, 182, 74, "20180283", 2, 4.5);
student1.show(); //코드에 입력되어 있는 값들의 출력.
Salesman salesman1 = new Salesman("주호식", 24, 180, 100, "12345", "800만원", "부장");
salesman1.show(); //코드에 입력되어 있는 값들의 출력.
}
}
|
cs |
여기서 나오는 super는 자식 클래스에서 부모 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조 변수입니다.
이 코드도 어렵게 생각하실 필요가 없습니다. 코드를 들여다보면 getter와 setter가 각 변수마다 선언되어 있고 부모가 가진 생성자를 실행해주는 super, 인스턴스(객체)를 만들어줄 때 자동으로 값을 초기화해주는 생성자가 사용되어 있을 뿐 복잡하지는 않습니다.
추상이란?
-추상 : 일종의 미완성 클래스
추상 클래스는 직접적으로 객체 인스턴스를 생성할 수 없다. 하지만 미리 설계함으로써 틀을 갖추고 클래스를 작성할 수 있게 한다는 기능적인 측면에서 의미가 있다.
추상 클래스를 사용하려면 꼭 상속을 받아야 하면 상속받은 모든 추상 메소드는 반드시 구현해야 한다.
한번 간단하게 음악명, 일시정지, 정지 기능만 있는 프로그램을 살펴보겠습니다.
코드로 보겠습니다.
1
2
3
4
5
6
|
abstract class Player { //추상클래스를 정의하는 가장 기본적인 방법
abstract void play(String MusicName);
abstract void pause(); //일시정지
abstract void stop(); //완전정지
} //이렇게 내부기능을 정해두지 않는다.
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class Main extends Player {
public static void main(String[] args) {
Main main = new Main();
main.play("존 박 - Sipping My Life");
main.pause();
main.stop();
}
@Override //메소드 재정의
void play(String MusicName) {
System.out.println(MusicName + "을 재생합니다.");
}
@Override
void pause() {
System.out.println("노래를 일시정지합니다.");
}
@Override
void stop() {
System.out.println("노래를 정지합니다.");
}
}
|
cs |
이렇게 추상 클래스에서는 메소드를 선언만 하고 구현하지 않고 상속받은 자식 클래스에서 메소드의 기능을 구현한다.
+) 존박 - Sipping My Life 진짜 인생 노래입니다. 우울하거나 멍 때 리거나 공허하면 항상 이 노래 들어요. 한 번씩 들어보세요.
이번에는 강아지와 고양이의 울음소리를 구현하는 간단한 코드를 구현해 보겠습니다.
코드로 보겠습니다.
1
2
3
|
abstract class Animal {
abstract void crying();
}
|
cs |
1
2
3
4
5
6
7
8
|
public class Dog extends Animal {
@Override
void crying() {
System.out.println("멍멍 월월 크르릉");
}
}
|
cs |
1
2
3
4
5
6
7
8
|
public class Cat extends Animal{
@Override
void crying() {
System.out.println("야옹~ 애옹쓰");
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
|
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.crying();
cat.crying();
}
}
|
cs |
생각보다 어렵지 않고 깔끔하게 코드를 만들 수 있습니다.
Final(최종)이란?
Final : 절대 변하지 않는 특정한 것을 정할 때 사용. 변수, 메소드, 클래스에서 모두 사용 가능하다.
변수에 사용 : 변하지 않는 상수가 된다.
메소드에 사용 : 재정의(Overriding)가 불가능한 메소드가 된다.
클래스에 사용 : 상속이 불가능한 완전한 클래스가 된다.
상수부터 코드로 보겠습니다.
1
2
3
4
5
6
7
8
9
|
public class FinalNum {
public static void main(String[] args) {
final int number = 10;
//number = 5; ->를 써보면 오류가 뜬다. number가 10으로 정의한 상수이기 때문!
System.out.println(number);
}
}
|
cs |
그다음은 메서드에 final을 사용한 코드를 보겠습니다.
1
2
3
4
5
6
7
|
public class FinalMethod {
public final void show() {
System.out.print("Hi");
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
|
public class FinalMethodMain extends FinalMethod {
public void show() { //부모클래스에서 show()메소드를 final로 선언하기 전에는 재정의 즉, Overriding이 가능했지만
System.out.println("Hello"); //final로 선언한 후에는 Overriding이 불가능해 오류가 발생합니다.
}
public static void main(String[] args) {
FinalMethodMain main = new FinalMethodMain();
main.show();
}
}
|
cs |
마지막으로 클래스에 final을 사용한 코드를 보겠습니다.
1
2
3
4
5
6
|
final class FinalClass {
public void show() {
System.out.println("Hi");
}
}
|
cs |
1
2
3
|
public class FinalClassMain extends FinalClass {
//Final로 선언한 클래스를 상속받자마자 오류가 발생합니다.
}
|
cs |
이렇게 final을 사용한 변수, 메소드, 클래스를 바꾸려고 하면 오류가 발생하는 모습을 찾을 수 있습니다.
오늘 이론은 여기서 끝입니다. 제가 봐도 확실히 난이도가 급상승하는 느낌이 없지 않아 있네요. 그래도 천천히 살펴보면 이해할 수 있으실 거라 믿습니다. 다 같이 힘들어도 포기하지 않고 노력하는 정신상태를 가지도록 노력합시다!
이번에도 예제입니다. 풀이는 다음 포스팅에서 확인할 수 있어요.
예제 1. 세 점을 사용자에게서 입력받아 세 점 사이의 중점을 구하는 프로그램.
예제 2. Person과 Student를 응용해서 몇 명의 학생의 정보를 입력받을 것인지 배열로 입력받고 각 줄마다 그 정보를 입력받아 인원수만큼의 입력이 끝나면 마지막에 한꺼번에 출력하는 프로그램
예제 3. 추상의 개념을 이용해서 철수와 영희가 우는 프로그램 구현.
'자바 공부' 카테고리의 다른 글
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 4일차 (인터페이스(interface), 다형성(Polymorphism), 객체(Object)클래스) (0) | 2021.01.16 |
---|---|
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 3일차 예제 풀이 (0) | 2021.01.15 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 2일차 예제 풀이 (0) | 2021.01.15 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 2일차 (객체지향, 메소드, 반복, 재귀, 배열, 다차원 배열) (0) | 2021.01.14 |
[JAVA]초보 개발자 김주호와 기초부터 시작하는 자바공부 1일차 예제 풀이 (0) | 2021.01.13 |