1. 객체지향 언어
현실에 존재하는 사물과 개념들을 소프트웨어적으로 구현하고, 그 객체들이 상호작용하여 데이터를 처리하는 방식입니다.
특징
(1) 코드의 재사용성 : 새로운 코드 작성시 기존 코드를 이용합니다. 코드의 수를 줄이고 유지 보수가 편리합니다.
(2) 신뢰성 높은 프로그래밍 : 제어자, 메소드를 사용해서 데이터를 보호합니다. 코드의 중복을 제거해 오작동 방지합니다.
(3) 코드 관리의 편리함 : 객체지향 프로그래밍은 한 부분만 변경하면 관련된 모든 부분이 변경됩니다. 코드의 관리가 편리합니다.
2. 클래스와 객체
(1) 클래스 : 자동차를 만들기 위해 설계도가 필요하듯이, 객체를 만들기 위해서는 객체의 설계도가 필요합니다.
여기서 클래스가 객체의 설계도와 같은 역할을 합니다. 클래스에는 객체의 속성과 기능들이 정의되어 있고 이를 통해 객체를 생성합니다.
(2) 인스턴스(instance) : 실질적으로 만들어진 형태입니다. 클래스를 통해 객체를 만드는 과정을 클래스의 인스턴스화라고 합니다.
(3) 클래스의 사용 : 클래스는 관계있는 변수와 메소드의 집합입니다.
클래스의 사용 예시는 아래와 같습니다.
class 클래스명{
/* 속성(변수) 작성 */
/* 기능( 메서드) 작성 */
}
package JAVA1213;
class car{
boolean powerOn;//시동
String color; // 차량의 색상
int wheel; // 바퀴의 수
int speed; // 속력
boolean wiperOn;// 와이퍼
void power( ) { powerOn = !powerOn;} // 시동 메서드
void speedUp( ) { speed++; } // 액셀 메서드
void speedDown( ) { speed--; } // 브레이크 메서드
void wiper( ) { wiperOn = !wiperOn; } // 와이퍼 메서드
}
public class class01 {
public static void main(String[] args) {
car mycar = new car( );
System.out.println("시동 처음 초기화:"+mycar.powerOn);
System.out.println("차의 색상 초기화:"+mycar.color);
System.out.println("바퀴의 수 초기화:"+mycar.wheel);
System.out.println("속력 초기화:"+mycar.speed);
System.out.println("와이퍼 작동 초기화:"+mycar.wiperOn);
mycar.power( ); // 시동 메서드 실행
System.out.println("시동 메서드 동작:"+mycar.powerOn);
mycar.power( ); // 시동 메서드 실행
System.out.println("시동 메서드 다시 동작:"+mycar.powerOn);
mycar.color = "black"; // 색상 변수에 black 대입
System.out.println("현재 차의 색상:"+mycar.color);
car mycar1 = new car( ); // car 인스턴스 생성
car mycar2 = new car( ); // car 인스턴스 하나 더 생성
mycar1.color = "red"; // mycar1의 색상 빨강
mycar2.color = "black"; // mycar2의 색상 검정
mycar1.speedUp( ); // mycar1 액셀 메서드 호출
mycar2.wiper( ); // mycar2 와이퍼 메서드 호출
System.out.println("mycar1의 색 : "+mycar1.color);
System.out.println("mycar2의 색 : "+mycar2.color);
System.out.println("mycar1의 속도 : "+mycar1.speed);
System.out.println("mycar2의 속도 : "+mycar2.speed);
System.out.println("mycar1의 와이퍼 작동 여부 : "+mycar1.wiperOn);
System.out.println("mycar2의 와이퍼 작동 여부 : "+mycar2.wiperOn);
}
}
시동 처음 초기화:false
차의 색상 초기화:null
바퀴의 수 초기화:0
속력 초기화:0
와이퍼 작동 초기화:false
시동 메서드 동작:true
시동 메서드 다시 동작:false
현재 차의 색상:black
mycar1의 색 : red
mycar2의 색 : black
mycar1의 속도 : 1
mycar2의 속도 : 0
mycar1의 와이퍼 작동 여부 : false
mycar2의 와이퍼 작동 여부 : true
3. 인스턴스 변수와 클래스 변수
(1) 인스턴스 변수 : 객체마다 가지는 고유한 변수입니다.
각자 고유의 저장 공간을 가지고 다른 값을 가질 수 있습니다.
ex) 사용예시 : int speed
(2) 클래스 변수 : 모든 인스턴스가 공통된 값을 공유하는 변수입니다.
다른 클래스 내에서도 해당 변수를 사용할 수 있습니다.
ex) 사용예시 : static int wheel
package JAVA1213;
class Cars{
static int wheel = 4; // 클래스변수
int speed; // 인스턴스 변수
}
public class class02 {
public static void main(String[] args) {
System.out.println(Cars.wheel); // 클래스 변수 접근 가능
// System.out.println(cars.speed); // 에러발생! 인스턴스 변수 접근 불가
Cars myCar1 = new Cars( );
System.out.println(Cars.wheel);
System.out.println(myCar1.speed); // 인스턴스 생성 후에는 접근 가능
Cars myCar2 = new Cars( );
System.out.println("< 변경 전 >");
System.out.println("myCar1.speed : "+ myCar1.speed);
System.out.println("myCar2.speed : "+ myCar2.speed);
System.out.println("myCar1.wheel : "+ myCar1.wheel);
System.out.println("myCar2.wheel : "+ myCar2.wheel);
myCar2.speed = 100;
myCar2.wheel = 5;
System.out.println("< 변경 후 >");
System.out.println("myCar1.speed : "+ myCar1.speed);
System.out.println("myCar2.speed : "+ myCar2.speed);
System.out.println("myCar1.wheel : "+ myCar1.wheel);
System.out.println("myCar2.wheel : "+ myCar2.wheel);
}
}
4
4
0
< 변경 전 >
mycar1.speed : 0
mycar2.speed : 0
mycar1.wheel : 4
mycar2.wheel : 4
< 변경 후 >
mycar1.speed : 0
mycar2.speed : 100
mycar1.wheel : 5
mycar2.wheel : 5
클래스의 추가 예시
문제) 학생의 성적 기록을 모델 하는 클래스를 작성한다. 학생의 성적은 과제 점수와 시험 점수로 이루어진다.
우리는 학생의 점수들의 총점을 계산해야 한다. 총점에 과제 점수와 시험 점수의 반영률은 각각 40%와 60% 이다
학생이 얻은 총점에 기초하여 학점을 부여 해야 한다.
학점 부여 기준은 다음과 같다.
- 총점이 90 이상이면 학점은 A이다.
- 총점이 80 이상이고 90미만이면 학점은 B이다.
- 총점이 70 이상이고 80미만이면 학점은 C이다.
- 총점이 60 이상이고 70미만이면 학점은 D이다.
- 총점이 60 미만이면 학점은 F이다.
package JAVA1213;
public class student {
public String name; //이름
public int assignmentScore; //과제 점수
public int examScore; //시험 점수
public String toString() {
String str = "";
str += "이름 : " + name + "\n";
str += "과제 점수 : " + assignmentScore + "\n";
str += "시험 점수 : " + examScore + "\n";
str += "학점 : " + getGrade() + "\n";
return str;
}
public char getGrade() {
char letterGrade; //학생의 학점
double total; //학생의 총점
total = assignmentScore * 0.4 + examScore * 0.6;
//총점에 따른 학점부여
if(total >= 90) letterGrade = 'A';
else if(total >= 80) letterGrade = 'B';
else if(total >= 70) letterGrade = 'C';
else if(total >= 60) letterGrade = 'D';
else letterGrade = 'F';
return letterGrade;
}
}
package JAVA1213;
public class studentDriver {
public static void main(String[] args) {
//첫 번째 학생을 나타내는 객체를 만든다.
student stud1 = new student();
stud1.name = "선남";
stud1.assignmentScore = 91;
stud1.examScore = 84;
System.out.println(stud1.toString());
student stud2 = new student();
stud2.name = "선녀";
stud2.assignmentScore = 86;
stud2.examScore = 84;
System.out.println(stud2.toString());
}
}
이름 : 선남
과제 점수 : 91
시험 점수 : 84
학점 : B
이름 : 선녀
과제 점수 : 86
시험 점수 : 84
학점 : B
별도의 파일로 클래스를 만들어 원하는 값들을 입력한 후 한 번에 출력할 수 있도록 합니다.
이렇게 되면 main에 사용되는 코드가 확실하게 간단해집니다.
package JAVA1213;
import java.util.Scanner;
public class studentDriver1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//첫 번째 학생을 나타내는 객체를 만든다.
student stud1 = new student();
System.out.print("학생의 이름을 입력하세요 : ");
stud1.name = scan.next();
System.out.print("학생의 과제 점수를 입력하세요 : ");
stud1.assignmentScore = scan.nextInt();
System.out.print("학생의 시험 점수를 입력하세요 : ");
stud1.examScore = scan.nextInt();
System.out.println(stud1.toString());
student stud2 = new student();
System.out.print("학생의 이름을 입력하세요 : ");
stud2.name = scan.next();
System.out.print("학생의 과제 점수를 입력하세요 : ");
stud2.assignmentScore = scan.nextInt();
System.out.print("학생의 시험 점수를 입력하세요 : ");
stud2.examScore = scan.nextInt();
System.out.println(stud2.toString());
}
}
학생의 이름을 입력하세요 : 선남
학생의 과제 점수를 입력하세요 : 91
학생의 시험 점수를 입력하세요 : 84
이름 : 선남
과제 점수 : 91
시험 점수 : 84
학점 : B
학생의 이름을 입력하세요 : 선녀
학생의 과제 점수를 입력하세요 : 86
학생의 시험 점수를 입력하세요 : 84
이름 : 선녀
과제 점수 : 86
시험 점수 : 84
학점 : B
위와 같이 Scan을 이용해 이름과 점수를 입력받아 결과를 출력할 수 있도록 할 수 있습니다.
class에 대해 학습을 하고 있지만 아직 응용을 하기에는 어려운 부분이 많네요
좀 더 이해할 수 있도록 많은 예제들을 풀어보겠습니다!
클래스 추가 예시2
class 1) 대학교의 직원을 나타내는 Employee 클래스를 작성하라.
직원은 이름, 번호, 나이를 가진다.
직원의 이름, 번호, 나이를 각각 알려 줄 수 있어야 한다.
또한 직원의 모든 데이터 (이름, 번호, 나이)를 한꺼번에 알려 줄 수 있어야 한다.
직원의 이름, 번호, 나이를 각각 주어진 값으로 변경할 수 있어야 한다.
class 2) Employee 클래스를 시험하는 드라이버 클래스를 작성하라.
첫 번째 직원을 나타내는 Employee객체를 만들어야 한다.
다음으로 그 Employee 객체의 이름을 '이도령'으로 하고 번호를 100으로, 나이를 25로 정한다.
그 Employee 객체의 이름, 번호, 나이를 출력해야한다.
그러고나서 두 번째 직원을 나타내는 Employee객체를 만들어야 한다.
다음으로 그 Employee 객체의 이름을 '성춘향'으로 하고 번호를 200, 나이 18로 정해야한다.
그 Employee 객체의 이름, 번호, 나이를 출력해야한다.
다음으로 그 Employee 객체의 번호를 300으로 변경해야한다.
마지막으로 그 Employee 객체의 이름, 번호, 나이를 출력해야 한다.
package JAVA1213;
public class Employee {
public String name;
public int number;
public int age;
public Employee() {
}
public String getName() {
return name;
}
public int getNumber() {
return number;
}
public int getAge() {
return age;
}
public String toString() {
String str = "";
str += "이름 : " + name + "\n";
str += "번호 : " + number + "\n";
str += "나이 : " + age + "\n";
return str;
}
public void setName(String Name) {
name = Name;
}
public void setNumber(int Number) {
number = Number;
}
public void setAge(int Age) {
age = Age;
}
}
package JAVA1213;
public class EmployeeDriver {
public static void main(String[] args) {
Employee emp1 = new Employee();
emp1.name = "이도령";
emp1.number = 100;
emp1.age = 25;
System.out.println(emp1.toString());
Employee emp2 = new Employee();
emp2.setName("성춘향");
emp2.setNumber(200);
emp2.setAge(18);
System.out.println(emp2.toString());
emp2.setNumber(300);
System.out.println(emp2.toString());
}
}
이름 : 이도령
번호 : 100
나이 : 25
이름 : 성춘향
번호 : 200
나이 : 18
이름 : 성춘향
번호 : 300
나이 : 18
get 함수는 구현만하고 사용하지는 않았습니다. 위의 방법으로 값을 불러오는 것이 가능합니다!
class에 대해서 배워봤는데 역시 설계라는 것은 어렵네요,,
그렇지만 설계도 여러번 하면 뼈대를 쉽게 그릴 수 있는 것처럼 더 많은 문제를 풀어보겠습니다!!!!!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 자바의 정석 ch2 연습문제 풀이 (0) | 2022.12.18 |
---|---|
[java] 클래스(class)를 이용한 메서드(method) (0) | 2022.12.13 |
[java] 22.12.12 심화 문제 풀이 (0) | 2022.12.13 |
[java] 메서드, 재귀메서드를 이용한 심화 문제 풀이 (0) | 2022.12.13 |
[java] 반복문(for, while, do~while) (0) | 2022.12.13 |