기록
day 0517 객체와 클래스_생성자_this 본문
/*
PROGRAMMING 2.
책을 나타내는 Book 클래스를 정의하여 보자. Book 클래스는 제목(title)과
저자(author)를 나타내는 필드를 가진다.
1) 각 필드를 직접 접근하여서 제목에 "Great Java"를 대입하고 저자에 "bob"을 대입하여 보자.
2) 접근자와 설정자 메소드를 정의하고 이것을 통하여 제목과 저자를 설정하여 보자.
*/
package com.kosta.exam;
class Book{
private String title;
private String author;
public Book() { // 생성자 만들기
title = "재미있는 자바"; // 초기값 만들기
author = "KOSTA";
}
public String getTitle() { // public 누구나 사용할 수 있는 : return 하는 값의 자료형을 적어준다
return title; // 객첵가 갖고있는 title을 돌려준다
}
public String getAuthor() {
return author;
}
public void setTitle(String t) { // setter 변경하는거라 매개변수가 필요하다
title = t;
}
public void setAuthor(String a) {
author = a;
}
}
public class BookTest {
public static void main(String[] args) {
// 참조하는 객체가 다르다
Book b1 = new Book(); // 객체를 생성
Book b2 = new Book();
/*
b1.title = "";
private 영역의 멤버변수에 직접 접근할 수 없어요
public에 있는 메소드를 통하여 접근하도록 해야 합니다
접근해서 값을 변경시키는 기능 setXXX() ==> setter 설정자
접근해서 값을 읽어오는 기능 getXXX() ==> getter 접근자
*/
// b1.title = ""; 직접 접근은 할 수 없다
b1.setTitle("Great Java");
b1.setAuthor("bob");
/*
private 영역에 접근하여 변경시키는 것 뿐 아니라
읽어 오는 것도 접근할 수 없어요.
읽어 오기 위한 기능도 public에 만들어야 합니다.
*/
// System.out.println(b1.title); 접근 할 수 없다
System.out.println("제목 : " + b1.getTitle() + ", 저자: " + b1.getAuthor());
System.out.println("제목 : " + b2.getTitle() + ", 저자: " + b2.getAuthor());
}
}
public class BookTest { public static void main(String[] args) {
Book b1 = new Book();
Book b2 = new Book();
b1.setTitle("Great Java");
b1.setAuthor("bob");
Book 객체를 생성하고 도서명과 저자를 초기화하고 있어요.
처음부터 책 이름과 저자가 정해진 경우라면
객체를 생성함과 동시에 멤버변수들의 값을 초기화 할 수 있어요
이러한 목적으로 사용하는 특수한 메소드를 "생성자"라고 합니다
<< 생성자 만드는 방법 >>
클래스이름과 동일한 이름으로 메소드를 만들어주고
생성자는 일반 메소드처럼 호출문에 의해 동작하는 것이 아니기 때문에
리턴 타입을 따로 적지 않아요. (void 라고도 하면 안된다.)
void는 리턴값이 없지만 리턴을 한다
package com.kosta.exam05;
class Book{
private String title;
private String author;
// 매개변수에 생성자를 2개 갖도록 만든다.
public Book(String t, String a) {
title = t;
author = a;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public void setTitle(String t) {
title = t;
}
public void setAuthor(String a) {
author = a;
}
}
public class BookTest {
public static void main(String[] args) {
// Book b = new Book(); // error
Book b1 = new Book("재미있는 자바", "book1");
Book b2 = new Book("신나는 자바", "book2");
System.out.println("제목 : " + b1.getTitle() + ", 저자: " + b1.getAuthor());
System.out.println("제목 : " + b2.getTitle() + ", 저자: " + b2.getAuthor());
}
}
생성자의 매개변수 이름을 의미있는 이름으로 정하다보면 멤버변수 이름과 겹치게되고
이때 생성자 body 안에서는 매개변수가 우선순위가 높아서 멤버변수에는 초기화되지 않습니다.
매개변수 값(String title, String author)에 매개변수 값을 저장하는 의미없는 동작을 하게 됩니다.
멤버 자신을 this라는 키워드로 구분할 수 있도록 this.title, this.author로 사용한다
<< this >>
멤버 자신을 구변할 목적으로 this를 사용합니다.
package com.kosta.exam06;
class Book{
private String title;
private String author;
// 멤버, 매개변수 이름이 동일하면 매개변수의 우선순위가 높다
// title : null, author : null
public Book(String title, String author) {
title = title;
author = author;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public void setTitle(String t) {
title = t;
}
public void setAuthor(String a) {
author = a;
}
}
public class BookTest {
public static void main(String[] args) {
Book b1 = new Book("재미있는 자바", "book1");
Book b2 = new Book("신나는 자바", "book2");
System.out.println("제목 : " + b1.getTitle() + ", 저자: " + b1.getAuthor()); // null
System.out.println("제목 : " + b2.getTitle() + ", 저자: " + b2.getAuthor()); // null
}
}
package com.kosta.exam07;
class Book{
private String title;
private String author;
// 멤버 자신을 구분할 목적으로 this를 사용한다
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public void setTitle(String title) {
this.title = title;
}
public void setAuthor(String author) {
this.author = author;
}
}
public class BookTest {
public static void main(String[] args) {
Book b1 = new Book("재미있는 자바", "book1");
Book b2 = new Book("신나는 자바", "book2");
System.out.println("제목 : " + b1.getTitle() + ", 저자: " + b1.getAuthor());
System.out.println("제목 : " + b2.getTitle() + ", 저자: " + b2.getAuthor());
}
}
package com.kosta.exam08;
class Book{
private String title;
private String author;
/*
생성자의 중복정의 (생성자의 Overloading)
==> 필요하다면 생성자를 중복하여 정의할 수 있어요.
==> 중복정의 할 때에는 다음의 조건을 만족해야 합니다.
매개변수의 개수가 다르거나 자료형이 달라야 합니다.
*/
// 생성자의 중복 만들기
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// this 써도되지만 매개변수가 없어서 중복 될 일이 없다
public Book() {
title = "제목없음";
author = "저자없음";
}
// title만
public Book(String title) { // (String title, String author) // error : 구분할 수 없음
this.title = title;
this.author = "저자없음";
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public void setTitle(String title) {
this.title = title;
}
public void setAuthor(String author) {
this.author = author;
}
}
public class BookTest {
public static void main(String[] args) {
Book b1 = new Book("재미있는 자바", "book1");
Book b2 = new Book();
Book b3 = new Book("신나는 자바");
System.out.println("제목 : " + b1.getTitle() + ", 저자: " + b1.getAuthor());
System.out.println("제목 : " + b2.getTitle() + ", 저자: " + b2.getAuthor());
System.out.println("제목 : " + b3.getTitle() + ", 저자: " + b3.getAuthor());
}
}
this ==> 멤버 자신을 구별 할 목적으로 사용합니다.
this() ==> 생성자가 중복정의 되어 있을 때 생성자 안에서 또 다른 생성자를
동작시키고자 할 때 사용하는 문장이고 반드시 생성자의 첫 번째 문장에 와야 합니다.
package com.kosta.exam09;
class Book{
private String title;
private String author;
// 생성자
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// 생성자 안에서 자신 외에 다른 생성자를 동작하기
public Book() {
// title = "제목없음";
// author = "저자없음";
this("제목없음", "저자없음"); // this는 무조건 첫번째에 사용한다
}
public Book(String title) {
this(title, "저자없음");
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public void setTitle(String title) {
this.title = title;
}
public void setAuthor(String author) {
this.author = author;
}
}
public class BookTest {
public static void main(String[] args) {
Book b1 = new Book("재미있는 자바", "book1");
Book b2 = new Book();
Book b3 = new Book("신나는 자바");
System.out.println("제목 : " + b1.getTitle() + ", 저자: " + b1.getAuthor());
System.out.println("제목 : " + b2.getTitle() + ", 저자: " + b2.getAuthor());
System.out.println("제목 : " + b3.getTitle() + ", 저자: " + b3.getAuthor());
}
}
/생성자 연습.pdf/
package com.kosta.exam10; // exam11
class Movie{
private String title;
private String name;
private String prod;
public Movie(String title, String name, String prod){
this.title = title;
this.name = name;
this.prod = prod;
}
public Movie() {
// 다른 생성자를 요구하는 this()는 생성자의 첫번째 문장에 와야 합니다
// System.out.println("매개변수를 갖지 않는 생성자 동작"); // error : Constructor call must be the first statement in a constructor
this("제목없음","이름없음","제작사없음");
}
public String getTitle(){
return title;
}
public String getName(){
return name;
}
public String getProd(){
return prod;
}
public void setTitle(String title){
this.title = title;
}
public void setName(String name){
this.name = name;
}
public void setProd(String Prod){
this.prod = prod;
}
}
public class MovieTest {
public static void main(String[] args) {
Movie m1 = new Movie();
Movie m2 = new Movie("신나는 자바","김은영","KOSTA");
System.out.println("제목 : " + m1.getTitle() + ", 이름 : " + m1.getName() + ", 제작사 : " + m1.getProd());
System.out.println("제목 : " + m2.getTitle() + ", 이름 : " + m2.getName() + ", 제작사 : " + m2.getProd());
}
}
<< 기본생성자 >>
매개변수를 하나도 갖지 않는 생성자를 말하며
사용자가 생성자를 만들지 않으면 자바가 "기본생성자"를 제공해주며
각각의 자료형에 따라 초기화 해 줍니다
참조자료형은 null
기본 자료형은 int 0, double 0.0, boolean false, ..
그러나 사용자가 생성자를 한개라도 만들기 시작하면
더이상 "기본생성자"를 제공하지 않아요.
필요하다면 사용자가 직접 만들어서 사용해야 합니다.
package com.kosta.exam12;
class Movie{
private String title;
private String name;
private String prod;
public String getTitle(){
return title;
}
public String getName(){
return name;
}
public String getProd(){
return prod;
}
public void setTitle(String title){
this.title = title;
}
public void setName(String name){
this.name = name;
}
public void setProd(String Prod){
this.prod = prod;
}
}
public class MovieTest {
public static void main(String[] args) {
Movie m = new Movie();
// 사용자가 생성자를 만들지 않아도 "기본생성자"가 제공된다(매개변수가 없다)
System.out.println(m.getTitle() + "," + m.getName() + "," + m.getProd());
}
}
package com.kosta.exam13;
class Person{
private String name;
private int age;
private double height;
// public Person(){} 이라는 매개변수가 없는 기본생성자 제공
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getHeight() {
return height;
}
}
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.getName() + "," + p.getAge() + "," + p.getHeight());
}
}
package com.kosta.exam14;
class Person{
private String name;
private int age;
private double height;
public Person(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getHeight() {
return height;
}
}
public class PersonTest {
public static void main(String[] args) {
// 사용자가 생성자를 만들기 시작하면 더이상 기본생성자를 제공하지 않아요
// 필요하다면 사용자가 만들어서 사용해야 합니다,
Person p = new Person();
System.out.println(p.getName() + "," + p.getAge() + "," + p.getHeight());
}
}
package com.kosta.exam15;
class Person{
private String name;
private int age;
private double height;
public Person(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
public Person() {
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getHeight() {
return height;
}
}
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
System.out.println(p1.getName() + "," + p1.getAge() + "," + p1.getHeight());
Person p2 = new Person("이름", 20, 178.3);
System.out.println(p2.getName() + "," + p2.getAge() + "," + p2.getHeight());
}
}
/Getters and Setters/
/생성자 자동 생성/
using Fields : 매개변수 있이
from Superclass : 매개변수 없이
/생성자 연습.pdf/
/*
은행 계좌를 나타내는 BankAccount라는 이름의 클래스를 설계하라.
BankAccount 클래스는 이름, 계좌 번호, 잔액, 이자율을 나타내는 필드를 가진다.
BankAccount 클래스의 생성자를 중복 정의하라.
생성자는 모든 데이터를 받을 수도 있고 아니면 하나도 받지 않을 수 있다.
*/
package com.kosta.exam17;
class BankAccount{
private String name;
private String account;
private double balance;
private double rate;
// 데이터를 받을 수도 있고
public BankAccount(String name, String account, double balance, double rate) {
this.name = name;
this.account = account;
this.balance = balance;
this.rate = rate;
}
// 하나도 받지 않을 수 있다
public BankAccount() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getRate() {
return rate;
}
public void setRate(double rate) {
this.rate = rate;
}
}
public class BankAccountTest {
public static void main(String[] args) {
BankAccount b1 = new BankAccount();
BankAccount b2 = new BankAccount("이름", "1102223333", 10000, 2.5);
System.out.println(b1.getName() + "," + b1.getAccount() + "," + b1.getBalance() + "," + b1.getRate());
System.out.println(b2.getName() + "," + b2.getAccount() + "," + b2.getBalance() + "," + b2.getRate());
}
}
/클래스와 객체.pdf/
package com.kosta.exam18;
class BankAccount{
private int balance; // 잔고
public void withdraw(int amount) { // 인출하는 메소드
// 잔액보다 더 큰 금액은 인출이 되지 않도록 한다
if(amount > balance) {
System.out.println("잔액이 부족합니다.");
return;
}
balance = balance - amount;
}
public void deposit(int amount) { // 입금하는 메소드
balance = balance + amount;
}
public int getBalance() { // 현재의 잔고를 반환하는 메소드
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
// 현재 잔액을 출력하는 메소드
public void printBalance(){
System.out.println("현재 잔액 : " + balance);
}
// 현재 잔액에 대하여 연 7.5%의 이자를 계산하여 추가하는 addInterest 메소드를 구현하고 테스트하라.
public void addInterest() {
balance = (int)(balance + balance * 0.075); // double이라 int로 형변환 해준다
}
}
public class BankAccountTest {
public static void main(String[] args) {
// a1, a2 두개의 BankAccont 객체를 생성한다
BankAccount a1 = new BankAccount();
BankAccount a2 = new BankAccount();
// a1의 잔고를 100으로 한다
int b1 = 100;
a1.setBalance(b1);
// a1에서 60을 인출한다
a1.withdraw(60);
//a1의 잔고를 얻어서 화면에 출력한다
// 변수에 저장하여 출력하기
int balance1 = a1.getBalance();
System.out.println(balance1);
// a2의 잔고를 50으로 한다
a2.setBalance(50);
// a2에서 30을 인출한다
a2.withdraw(30);
// a2의 잔고를 얻어서 화면에 출력한다
System.out.println(a2.getBalance());
System.out.println("========== ");
a1.printBalance();
a2.printBalance();
System.out.println("연 7.5% 이자 : ");
a1.addInterest();
a2.addInterest();
// 연 7.5%이자 후 잔액
a1.printBalance();
a2.printBalance();
System.out.println("100 인출 : ");
// 현재 잔고가 음수일 경우 인출되지 않도록
a1.withdraw(100);
a1.printBalance(); // -57
}
}
/double로 변경/
package com.kosta.exam19;
class BankAccount {
// double로 변경
private double balance;
public void withdraw(int amount) {
if(amount > balance) {
System.out.println("잔액이 부족합니다.");
return;
}
balance = balance - amount;
}
public void deposit(int amount) {
balance = balance + amount;
}
// double로 변경
public double getBalance() {
return balance;
}
// int는 double에 포함이 된다
// double data = 5; // 가능
// int data = 5.0; // 불가능
public void setBalance(int balance) {
this.balance = balance;
}
public void printBalance(){
System.out.println("현재 잔액 : " + balance);
}
public void addInterest() {
balance = balance + balance * 0.075;
}
}
public class BankAccountTest {
public static void main(String[] args) {
// a1, a2 두개의 BankAccont 객체를 생성한다
BankAccount a1 = new BankAccount();
BankAccount a2 = new BankAccount();
// a1의 잔고를 100으로 한다
int b1 = 100;
a1.setBalance(b1);
// a1에서 60을 인출한다
a1.withdraw(60);
//a1의 잔고를 얻어서 화면에 출력한다
// 변수에 저장하여 출력하기
double balance1 = a1.getBalance();
System.out.println(balance1);
// a2의 잔고를 50으로 한다
a2.setBalance(50);
// a2에서 30을 인출한다
a2.withdraw(30);
// a2의 잔고를 얻어서 화면에 출력한다
System.out.println(a2.getBalance());
System.out.println("========== ");
a1.printBalance();
a2.printBalance();
System.out.println("연 7.5% 이자 : ");
a1.addInterest();
a2.addInterest();
// 연 7.5%이자 후 잔액
a1.printBalance();
a2.printBalance();
System.out.println("100 인출 : ");
// 현재 잔고가 음수일 경우 인출되지 않도록
a1.withdraw(100);
a1.printBalance(); // -57
}
}
14:00 ~ exam20 부터
/하나의 파일에 여러개의 클래스 만들기/
package com.kosta.exam20;
public class BankAccount {
private double balance;
public void withdraw(int amount) {
if(amount > balance) {
System.out.println("잔액이 부족합니다.");
return;
}
balance = balance - amount;
}
public void deposit(int amount) {
balance = balance + amount;
}
public double getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public void printBalance(){
System.out.println("현재 잔액 : " + balance);
}
public void addInterest() {
balance = balance + balance * 0.075;
}
}
package com.kosta.exam20;
/*
addInterest메소드의 동작방식을 변경했을때 호출한 쪽에서 수정할 부분은 없어요.
그러나 맴버변수인 balance의 자료형은 int에서 double로 변경하면 호출한 쪽에서도 수정해줘야 합니다.
일반적으로 하나의 파일에 하나의 클래스만 만는것이 일반적입니다.
부득이하게 하나의 파일에 여러개의 클래스를 만들때에는
파일명과 동일한 클래스에만 public을 붙입니다.
*/
public class BankAccountTest {
public static void main(String[] args) {
// a1, a2 두개의 BankAccont 객체를 생성한다
BankAccount a1 = new BankAccount();
BankAccount a2 = new BankAccount();
// a1의 잔고를 100으로 한다
int b1 = 100;
a1.setBalance(b1);
// a1에서 60을 인출한다
a1.withdraw(60);
//a1의 잔고를 얻어서 화면에 출력한다
// 변수에 저장하여 출력하기
double balance1 = a1.getBalance();
System.out.println(balance1);
// a2의 잔고를 50으로 한다
a2.setBalance(50);
// a2에서 30을 인출한다
a2.withdraw(30);
// a2의 잔고를 얻어서 화면에 출력한다
System.out.println(a2.getBalance());
System.out.println("========== ");
a1.printBalance();
a2.printBalance();
System.out.println("연 7.5% 이자 : ");
a1.addInterest();
a2.addInterest();
// 연 7.5%이자 후 잔액
a1.printBalance();
a2.printBalance();
System.out.println("100 인출 : ");
// 현재 잔고가 음수일 경우 인출되지 않도록
a1.withdraw(100);
a1.printBalance(); // -57
}
}
/Math.random();/
package com.kosta.exam23;
public class RandomTest {
public static void main(String[] args) {
double data = Math.random();
System.out.println(data);
// random : 0~6사이의 실수를 발생한다
double data2 = data *6;
System.out.println(data2);
// 형변환 (int) : 1~6사이의 난수를 발생
int n = (int)(Math.random() * 6);
System.out.println(n);
}
}
/*
PROGRAMMING 3.
주사위를 나타내는 클래스인 Dice를 작성하여 보자.
Dice 클래스에 필요한 필드와 메소드를 생각하여 보자.
메소드에는 주사위를 굴리는 메소드인 roll()을 포함하라.
roll() 메소드를 작성할 때 난수를 얻는 다음 문장을 참조하라.
face = (int)(Math.random() * 6) + 1;
Dice 클래스를 테스트하기 위한 별도의 클래스를 작성하여 테스트하라.
*/
package com.kosta.exam23;
public class Dice {
private int face;
public void roll() {
face = (int)(Math.random() * 6) + 1;
}
public int getFace() {
return face;
}
public static void main(String[] args) {
}
}
package com.kosta.exam23;
public class DiceTest {
public static void main(String[] args) {
Dice d1 = new Dice();
Dice d2 = new Dice();
d1.roll();
d2.roll();
System.out.println("첫번째 주사위의 면 : " + d1.getFace());
System.out.println("두번째 주사위의 면 : " + d2.getFace());
}
}
Person
package com.kosta.exam24;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Person의 모든 속성정보를 출력하는 메소드를 정의
public void info() {
System.out.println("이름 : " + name + ", 나이 : " + age);
}
public Person() {
}
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;
}
}
package com.kosta.exam24;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person("이름", 20);
// System.out.println("이름 : " + p1.getName() + ", 나이 : " + p1.getAge() );
// info라는 메소드에 속성 값 출력하기(Person class의 기능)
p1.info();
}
}
/속성정보 문자열로 반환하기/
package com.kosta.exam25;
public class Person {
private String name;
private int age;
// Person의 모든 속성정보를 문자열로 반환하는 메소드
public String getInfo() {
String result = "이름 : " + name + ", 나이 : " + age;
return result;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
package com.kosta.exam25;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person("이름1", 20);
Person p2 = new Person("이름2", 30);
String data = p1.getInfo();
System.out.println(data);
System.out.println(p1.getInfo());
System.out.println(p2.getInfo());
}
}
/주소값 출력/
package com.kosta.exam26;
public class Person {
private String name;
private int age;
// Person의 모든 속성정보를 문자열로 반환하는 메소드
public String getInfo() {
String result = "이름 : " + name + ", 나이 : " + age;
return result;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
}
package com.kosta.exam26;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person("이름1", 20);
Person p2 = new Person("이름2", 30);
// 주소값이 출력된다
System.out.println(p1); // com.kosta.exam26.Person@7c30a502
System.out.println(p2); // com.kosta.exam26.Person@49e4cb85
}
}
toString()
==> 자바의 제일 조상인 object의 메소드이며 객체의 속성값을 출력하고자 한다면
toString을 자신에 맞게 만들어서 사용할 수 있어요
cohttp://m.kosta.exam26.Person@7c30a502
toString 메소드를 정의하지 않았을 때는 위와 같이 주소값이 출력되며
toString을 다음과 같이 객체의 속성값을 문자열로 만들어서 반환하도록 하고 호출하면
객체의 속성값을 출력할 수 있어요.
return "[이름 : " + name + ", 나이 : " + age + "]";
결과 : [이름 : 이름1, 나이 : 20]
package com.kosta.exam27;
public class Person {
private String name;
private int age;
public String toString() {
// String result = "이름 : " + name + ", 나이 : " + age;
// return result;
return "[이름 : " + name + ", 나이 : " + age + "]";
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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;
}
}
package com.kosta.exam27;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person("이름1", 20);
Person p2 = new Person("이름2", 30);
// toString 메소드 만들고 출력하기
System.out.println(p1);
System.out.println(p2);
}
}
<< 클래스 변수(정적 변수)와 클래스 메소드 >>
클래스 변수는 멤버변수명 앞에 static 키워드가 붙은 변수를 말하며
모든 객체가 공동으로 사용할 기억공간이 필요하거나 객체와 무관하게 사용할 수 있는 변수입니다.
클래스 메소드는 멤버메소드명 앞에 static 키워드가 붙은 메소드를 말하며
객체와 무관하게 사용할 수 있는 메소드를 말합니다.
package com.kosta.exam28;
public class Family {
// 객체 멤버변수
private String name;
private int age;
// static : 객체와 무관하게 사용한다
public static String addr;
// 객체와 무관하게 호출하고싶다면 static을 붙인다
public static void pro() {
System.out.println("pro입니다");
}
public void info() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
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 Family(String name, int age) {
this.name = name;
this.age = age;
}
public Family() {
}
}
package com.kosta.exam28;
public class FamilyTest {
public static void main(String[] args) {
// 객체와 무관하게 호출한다 : public static void pro() {}
Family.pro();
// static 키워드가 붙어있는 멤버변수는 객체와 무관하게 사용할 수 있어요.
// 클래스 이름으로 접근합니다 ==> 클래스 변수
Family.addr = "서울시 종로구";
System.out.println(Family.addr);
// Family.name = "홍길동"; // error
Family f1 = new Family("이름1", 30);
Family f2 = new Family("이름2", 30);
f1.pro();
f2.pro();
// f1.addr 과 f2.addr은 같다 (공동기억장소)
System.out.println(f1.getName() + ", " + f1.addr);
System.out.println(f2.getName() + ", " + f2.addr);
// f1이 바뀌면 f2도 바뀐다
f1.addr = "제주도 서귀포시";
System.out.println(f1.getName() + ", " + f1.addr);
System.out.println(f2.getName() + ", " + f2.addr);
}
}
위의 클래스에서 name, age는 클래스의 멤버변수이며 반드시 객체를 생성해야만 사용할 수 있고
또 객체마다 별도의 메모리 공간이 잡힙니다.
pro() 메소드 역시 반드시 객체를 생성하고 그 객체를 통해서 호출 할 수 있어요.
그런데 만약 객체와 무관하게 사용하고자하는 변수가 필요하다면
변수이름 앞에 static 키워드를 붙여 변수를 만들게되면 객체와 무관하게
또, 모든 객체가 동일한 기억장소로 사용할 수 있어요.
객체와 무관하게 사용해야하기 때문에 클래스이름으로 접근합니다.
그래서 "클래스 변수", "클래스 메소드"라고 합니다.
package com.kosta.exam29;
/*
클래스 메소드는 객체없이도 동작하는 메소드이기 때문에
객체를 생성해야지만 확보되는 메모리 영역인 name과 age에 접근할 수 없어요.
static 메소드에서는 static 멤버만 접근할 수 있어요.
*/
public class Family {
// 객체 멤버변수 : 객체를 생성해야 사용한다
private String name;
private int age;
// static : 객체와 무관하게 사용한다
public static String addr;
// 객체와 무관하게 호출하고싶다면 static을 붙인다 (클래스 메소드)
public static void pro() {
// name = "홍길동"; // error : 객체 멤버변수
// age = 21;
addr = ""; // 접근가능
System.out.println("pro입니다");
}
public void info() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
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 Family(String name, int age) {
this.name = name;
this.age = age;
}
public Family() {
}
}
package com.kosta.exam29;
public class FamilyTest {
public static void main(String[] args) {
Family.pro();
Family.addr = "서울시 종로구";
System.out.println(Family.addr);
Family f1 = new Family("이름1", 30);
Family f2 = new Family("이름2", 30);
f1.pro();
f2.pro();
System.out.println(f1.getName() + ", " + f1.addr);
System.out.println(f2.getName() + ", " + f2.addr);
f1.addr = "제주도 서귀포시";
System.out.println(f1.getName() + ", " + f1.addr);
System.out.println(f2.getName() + ", " + f2.addr);
}
}
/생성자 연습.pdf/
/*
PROGRAMMING 2.
비행기를 나타내는 Plane라는 이름의 클래스를 설계하라.
Plane 클래스는 제작사(예를 들어서 에어버스), 모델(A380), 최대 승객수(500)를 필드고 가지고 있다.
1) 필드를 정의하라. 모든 필드는 전용 멤버로 하라.
2) 모든 필드에 대한 접근자와 설정자 메소드를 작성한다.
3) Plane 클래스의 생성자를 몇 개를 중복 정의하라.
생성자는 모든 데이터를 받을 수도 있고 아니면 하나도 받지 않을 수 있다.
4)
5)
6)
*/
package com.kosta.exam30;
public class Plane {
private String company; // 제작사
private String model; // 모델
private int max; // 최대 승객수
public static int planes; // 비행기 개수
public static int getPlanes() {
return planes;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public Plane(String company, String model, int max) {
planes++;
this.company = company;
this.model = model;
this.max = max;
}
public Plane() {
planes++;
}
}
package com.kosta.exam30;
public class PlaneTest {
public static void main(String[] args) {
Plane.planes = 0; // static 변수 초기화
Plane p1 = new Plane();
Plane p2 = new Plane("에어버스", "A380", 500);
p1.setCompany("보잉");
p1.setModel("보잉747");
p1.setMax(300);
System.out.println(p1.getCompany() + ", " + p1.getModel() + ", " + p1.getMax());
System.out.println(p2.getCompany() + ", " + p2.getModel() + ", " + p2.getMax());
System.out.println("비행기 개수 : " + Plane.planes);
System.out.println("비행기 개수 : " + Plane.getPlanes());
}
}
- 이번주 학습내용 객체와 클래스와 관련하여 개념정리를 잘 하도록 합니다.
- 이해가 되지않는 부분은 무엇이든지 질문하고 이해하고 넘어 가도록 합니다.
- 개념정리 다 된 사람들은 다음을 프로그래밍 해 봅니다.
pdf "객체와 클래스" LAB 1, 2
pdf "생성자 연습" PROGRAMMING 1, 3
<< 숙제 >>
다음의 두가지 중에 하나 이상의 클래스를 만들어 봅니다.
1) 하늘을 날으는 "새"에 대하여 속성과 동작을 분석하여 클래스를 만들고 테스트 해 봅니다.
2) 집에 있는 가전제품중에 하나를 선택하여 속성과 동작을 분석하여 클래스를 만들고 객체를 생성 해 봅니다.
'📖' 카테고리의 다른 글
day 0521 추상클래스_추상메소드 (0) | 2024.05.21 |
---|---|
day 0520 상속_메소드 오버라이딩_객체의 배열 (0) | 2024.05.20 |
day 0516 정렬_객체와 클래스 (0) | 2024.05.16 |
day 0514 배열_메소드 (0) | 2024.05.14 |
day 0513 반복문_배열 (1) | 2024.05.13 |