[Day 06] 국비 0404 - 내용 정리
🌞사용자 정의 자료형(클래스)
- 기본 자료형(boolean, char, byte, short, int, long, float, double) 만으로는 프로그램 만들기가 번거로워서 사용자(개발자)가 새로운 자료형을 만들 수 있다.
- 이름, 국어, 영어, 수학, 총점, 평균을 하나의 세트로 만들 수 있다. ==> 클래스
🌞객체지향 프로그래밍(Object Oriented Programming - OOP)
🌈객체지향 프로그래밍(Object Oriented Programming - OOP)
- 현실 세계의 모든 것을 객체화 할 수 있다.(눈에 보이는 것일 수도 있고, 눈에 안 보이는 개념적인 것일 수도 있다.)
🌈객체
- 세상을 구성하고 모든 것을 객체라고 말 할 수 있다. 이 세상에서 유일한 것, 단 하나밖에 없는 것.
- 그 객체들은 각자 그 객체를 구성하기 위한 고유한 속성들로 구성되어 있다.
ex) 정수가 손에 핸드폰을 들고 이스트백을 메고 은행에 들어간다.
객체가 될 수 있는 것: _정수, 핸드폰, 이스트백, 은행_
손 정수
든다 정수
멘다 정수
들어간다 정수
- "정수" 라는 객체를 표현하기 위해서 "사람"이라는 클래스를 만들 때에 그 "사람"이라는 클래스에는 "손" 이라는 속성 "든다", "멘다", "들어간다"라는 동작으로 구성되게 만들어야 한다.
- 자바로 객체지향 프로그래밍을 할 때에는 내가 표현해야 하는 대상에 대하여 속성(데이터)과 동작(기능)을 분석하여 클래스에 먼저 만들어야 한다.
사람 Person(클래스)
속성(맴버변수)
이름 String name "홍길동"
나이 int age 20
동작(맴버 메소드)
먹는다 void eat(String food)
씻는다 void wash(String soap)
🌈객체지향 프로그래밍의 특징
1. 은닉성(encapsulation)
- 클래스를 구성하고 있는 구성요소들을 외부의 다른 클래스로부터 보호하는 것을 말한다.
- 모든 구성요소들을 보호하게되면 아예 그 클래스 자체를 사용할 수 없다.
🌝접근명시자🌝
- private : 외부의 어떠한 클래스도 접근할 수 없다.
- public: 외부의 어떤 클래스라도 접근할 수 있다.
- protected: 외부의 클래스로부터는 보호하되 상속한 자식 클래스에게는 접근을 허용한다.
- default(생략): 외부의 클래스로부터는 보호하되 동일한 패키지에 있는 클래스들에게는 허용한다.
2. 상속성
3. 다형성
🌞생성자(Constructor)
- 클래스 이름과 같은 이름을 가진 메소드를 말하며, 객체 생성시에 자동으로 수행되어 멤버변수(들)의 값을 초기화할 목적으로 사용하는 특수한 메소드이다.
- 다른 일반 메소드들은 호출문에 의해서 동작하고, 메소드의 내용이 끝나면 호출한 쪽으로 return 하게 되어있다.
- 그래서 모든 메소드들은 return 하는 값의 자료형을 메소드 이름 왼쪽에 작성한다.
- 만약, return하는 값이 없다면 void라고 작성한다.
- 그러나 생성자는 일반 메소드처럼 호출문에 의해서 동작하는 것이 아니고, 객체 생성 시에 자동수행 되기 때문에 return에 개념이 없다.
- 그래서 생성자 함수는 이름 왼쪽에 void를 쓰면 안 된다.(아무것도 쓰지 않아야 함.)
🌈생성자의 중복(OverLoading/오버로딩)
- 생성자를 여러 개 만들어 사용할 수 있다. (중복)
- 생성자를 중복하기 위해서는 생성자 함수의 매개변수의 개수나 자료형이 달라야한다.
🌈this
- 메소드나 생성자의 매개변수 이름을 의미있는 이름으로 정해주다 보면 멤버변수 이름과 동일하게 된다.
- 이 때, 멤버 자신을 구별하기 위한 용도로 this를 사용한다.
🌈this()
- 생성자가 중복 정의되어 있을 때에 생성자 안에서 또 다른 생성자를 요구할 때 사용하는 명령
- this() 키워드는 반드시 생성자의 첫 번째 문장에 와야한다.
🌈기본 생성자
- 매개변수를 갖지 않는 생성자를 말하며, 자바는 사용자가 생성자를 하나도 만들지 않으면 기본생성자를 제공한다.
- 예를들어, 사용자가 다음과 같이 Person 클래스를 만들 때에
class Person {
}
- 사용자가 생성자를 만들지 않으면 기본생성자 즉, 매개변수를 갖지 않는 생성자를 자동으로 제공한다.
- 따라서 다음과 같이 객체를 생성할 수 있다.
Person p = new Person();
- 문자열은 null, 점수는 0, 실수는 0.0, boolean은 false로 초기화 된다.
- 그런데, 만약 사용자가 생성자를 한 개라도 만들기 시작하면 자바는 더 이상 기본 생성자를 제공하지 않는다.
class Person {
public Person (String name) {
}
}
Person p1 = new Person(); //이렇게 생성할 수 없다.
Person p2 = new Person("홍길동");
🌞정리
🌻 생성자에 대하여 설명하세요.
- 클래스 이름과 동일한 이름의 메소드를 말하며, 객체 생성 시에 자동 수행되어 맴버변수들의 값을 초기화 할 목적으로 사용하는 특수한 메소드이다.
- 또, 생성자는 호출문에 의해서 동작하는 것이 아니라 객체 생성 시에 자동수행 하기 때문에 리턴의 개념이 없다.
- 따라서 생성자 이름의 왼쪽에는 리턴 타입이 오지 않는다.
- 생성자는 중복하여 정의할 수 있다.
- 중복하여 정의하기 위해서는 매개변수의 개수나 자료형이 달라야한다.
- 사용자가 생성자를 하나라도 만들지 않으면 기본 생성자가 제공되지만 만약, 사용자가 생성자를 하나라도 만들기 시작하면 더이상 기본 생성자를 제공하지 않는다.
🌻 this와 this()에 대하여 설명하세요.
- this는 만약, 메소드나 생성자의 매개변수 이름을 의미있는 이름으로 정해주다 보면 멤버 이름과 동일하게 된다.
- 이 때, 멤버 자신을 구별할 목적으로 this를 사용한다.
- this()는 생성자가 중복정의 되어 있을 때에 생성자 안에서 또 다른 생성자를 요구할 때에 사용한다.
- 이 때에는 반드시 생성자의 첫 번째 문장에 와야한다.
🌞예제
🌟(class)예제1🌟
클래스를 입력받아 5명의 이름, 국어, 영어, 수학을 입력받아 총점, 평균을 구하고 성적 순으로 정렬하여 출력하는 프로그램
//class
public class Student { //class로 세트를 만들었다.
String name;
int kor, eng, math, tot;
double avg;
}
import java.util.Scanner;
public class StudentTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String []name = new String[5];
int []kor = new int[5];
int []eng = new int[5];
int []math = new int[5];
int []tot = new int[5];
double []avg = new double[5];
for(int i=0; i<name.length; i++) {
System.out.print((i+1)+ "번째 학생의 이름을 입력하세요: ");
name[i] = sc.next();
System.out.print((i+1)+ "번째 학생의 국어점수를 입력하세요: ");
kor[i] = sc.nextInt();
System.out.print((i+1)+ "번째 학생의 영어점수를 입력하세요: ");
eng[i] = sc.nextInt();
System.out.print((i+1)+ "번째 학생의 수학점수를 입력하세요: ");
math[i] = sc.nextInt();
tot[i] = kor[i] + eng[i] + math[i];
avg[i] = tot[i] / 3.0;
}
System.out.println("이름\t국어\t영어\t수학\t총점\t평균");
for(int i =0; i<name.length; i++) {
System.out.println(name[i] + "\t"
+ kor[i] + "\t"
+ eng[i] + "\t"
+ math[i] + "\t"
+ tot[i] + "\t"
+ avg[i]);
}
System.out.println("--------------------------------------------------");
System.out.println("*** 성적 순으로 정렬 ***");
//정렬
for (int i=0; i<name.length; i++) {
for(int j=i+1; j<name.length; j++) {
if(tot[j] > tot[i]) { //이름, 국어, 영어, 수학, 총점, 평균도 다 바꾸어 주어야 함.
String name_temp = name[i];
name[i] = name[j];
name[j] = name_temp;
int kor_temp = kor[i];
kor[i] = kor[j];
kor[j] = kor_temp;
int eng_temp = eng[i];
eng[i] = eng[j];
eng[j] = eng_temp;
int math_temp = math[i];
math[i] = math[j];
math[j] = math_temp;
int tot_temp = tot[i];
tot[i] = tot[j];
tot[j] = tot_temp;
double avg_temp = avg[i];
avg[i] = avg[j];
avg[j] = avg_temp;
}
}
}
for(int i =0; i<name.length; i++) {
System.out.println(name[i] + "\t"
+ kor[i] + "\t"
+ eng[i] + "\t"
+ math[i] + "\t"
+ tot[i] + "\t"
+ avg[i]);
}
}
}
🌟(class)예제2🌟
//class
public class Person {
private String name;
private int age;
//생성자가 매개변수를 가질 수도 있다.(매개변수 2개)
public Person(String n, int a) { //클래스 이름과 동일하게
name = n;
age = a;
}
//생성자 함수가 중복될 수 있다.
public Person() {
name = "홍길동";
age = 20;
}
public Person(String n) {
name = n;
age = 20;
}
public Person(int a) {
name = "홍길동";
age = a;
}
//name에 접근하여 값을 설정하는 메소드를 만든다.
public void setName(String n) { //setName, setAge 같은 맴버에 접근하여 값을 변경시키는 메소드들 ==> setter(설정자)라고 한다.
name = n;
}
//age에 접근하여 값을 설정하는 메소드
public void setAge(int a) {
age = a;
}
//name을 반환하는 메소드를 만든다.
public String getName() { //getName, getAge와 같은 맴버변수에 접근하여 값을 읽어오는 기능들 ==> getter(접근자)라고 한다.
return name;
}
//age를 반환하는 메소드
public int getAge() {
return age;
}
public void eat(String food) {
System.out.println(age + "살 " + name + "이(가) " + food + "를(을) 먹어요!");
}
public void wash(String soap) {
System.out.println(age + "살 " + name + "이(가) " + soap + "으로 씻어요!");
}
}
//출력
package exam05;
public class PersonTest {
public static void main(String[] args) {
// Person p1;
// p1 = new Person();
Person p1 = new Person(); //매개변수가 하나도 없으면 Person.java에서 설정해놓은 홍길동이 나옴.
Person p2 = new Person("이순신" , 30);
Person p3 = new Person("이순신");
Person p4 = new Person(30);
p1.eat("라면");
p2.eat("라면");
p3.eat("라면");
p4.eat("라면");
}
}
🌟(class, 생성자)예제3🌟
은행 계좌를 나타내는 BankAccount 클래스를 입력하고 다양한 실험을 해보자. BankAccount 는 잔고를 나타내는 정수형 멤버변수(balance)를 가지고 있고 예금 인출 메소드(draw)와 예입 메소드(deposit), 현재의 잔고를 반환하는 메소드(getBalance)를 가지고 있다.
//class
public class BankAccount {
private int balance; //잔액을 표시하는 변수
public void deposit(int amount) { //저금을 하는 메소드
balance += amount;
}
public void withdraw(int amount) { //인출하는 메소드
if(amount > balance) {
System.out.println("잔액이 부족합니다.");
return;
}
balance -= amount;
}
public void printBalance() { //현재 잔액을 출력하는 메소드
System.out.println("현재 잔액: " + getBalance());
}
public void addInterest() { //현재 잔액에 대하여 연 7.5%이자를 계산하여 추가하는 메소드
balance += (int)(balance*0.075);
}
public void setBalance(int balance) {
this.balance = balance;
}
public int getBalance() {
return balance;
}
//각각의 메소드 안에 내용을 구체화 해보기.
}
//출력
public class BankAccountTest {
public static void main(String[] args) {
BankAccount a1 = new BankAccount();
BankAccount a2 = new BankAccount();
a1.deposit(100);
a2.deposit(50);
a1.withdraw(60);
a2.withdraw(300);
//System.out.println("a1의 잔고: " + a1.getBalance());
//System.out.println("a2의 잔고: " + a2.getBalance());
a1.printBalance();
a2.printBalance();
a1.addInterest();
a2.addInterest();
a1.printBalance();
a2.printBalance();
}
}
🌞연습문제
👑연습문제1👑
로켓을 나타내는 Rocket클래스를 작성하고 테스트해보자. Rocket 클래스는 다음과 같은 필드와 메소드를 가진다.
//Rocket.java
public class Rocket {
private int x, y;
public Rocket(int x, int y) {
super();
this.x = x;
this.y = y;
}
public Rocket() {
super();
// TODO Auto-generated constructor stub
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public String toString() {
return "x: " + x + "\t" + "y: " + y;
}
public int moveUp() {
return y + 1;
}
}
//출력
public class RocketTest {
public static void main(String[] args) {
Rocket r1 = new Rocket(4, 5);
r1.moveUp();
r1.toString();
System.out.println(r1);
System.out.println(r1.moveUp());
System.out.println(r1.toString());
}
}
👑연습문제2👑
Person이라는 클래스를 작성하고 테스트해보자. Person 클래스는 다음과 같은 필드와 메소드를 가진다.
//Person.java
public class Person {
public String name;
private String mobile, office, email;
public void setName(String n) {
name = n;
}
public void setMobile(String m) {
mobile = m;
}
public void setOffice(String o) {
office = o;
}
public void setEmail(String e) {
email = e;
}
public String getName() {
return name;
}
public String getMobile() {
return mobile;
}
public String getOffice() {
return office;
}
public String getEmail() {
return email;
}
public Person(String n, String m, String o, String e) {
super();
this.name = n;
this.mobile = m;
this.office = o;
this.email = e;
}
public String toString() {
return "이름: " + name + "\t" +
"전화번호: " + mobile + "\t" +
"직장 전화번호: " + office + "\t" +
"이메일: " + email;
}
}
//출력
public class PersonTest {
public static void main(String[] args) {
Person p = new Person("홍길동", "010-1234-5678", "032)111-1111", "[email protected]");
System.out.println(p.toString());
}
}
👑연습문제3👑
노래 한 곡을 나타내는 클래스 Song 을 작성하고 테스트해보자. Song클래스는 다음과 같이 정의되고 사용된다. this()도 사용해보자.
//Song.java
public class Song {
private String title, artist;
private int length;
public Song(String title, String artist, int length) {
this.title = title;
this.artist = artist;
this.length = length;
}
public Song(String title, String artist) {
this.title = title;
this.artist = artist;
}
public Song(String title) {
this.title = title;
}
public Song() {
this("Outward Bound", "Nana", 180);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String aritst) {
this.artist = artist;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
}
//출력
package Practice187_03;
public class SongTest {
public static void main(String[] args) {
Song s1 = new Song("Outward Bound", "Nana", 180);
Song s2 = new Song("Jambalya", "Carpenters");
Song s3 = new Song("yesterday");
Song s4 = new Song();
System.out.println("노래 제목: " +s1.getTitle() + "\t" +
"가수: " +s1.getArtist() + "\t" +
"길이: " +s1.getLength() + "\t");
System.out.println("노래 제목: " +s2.getTitle() + "\t" +
"가수: " +s2.getArtist() + "\t" +
"길이: " +s2.getLength() + "\t");
System.out.println("노래 제목: " +s3.getTitle() + "\t" +
"가수: " +s3.getArtist() + "\t" +
"길이: " +s3.getLength() + "\t");
System.out.println("노래 제목: " +s4.getTitle() + "\t" +
"가수: " +s4.getArtist() + "\t" +
"길이: " +s4.getLength() + "\t");
}
}
Author And Source
이 문제에 관하여([Day 06] 국비 0404 - 내용 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rlaehdus0417/Day-06-국비-0404-내용-정리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)