Difference between r1.2 and the current
@@ -1,6 +1,6 @@
[[TableOfContents]]
== 일시 ==
|| 유재범 || 참석 ||
|| 최다인 || 참석 ||
== 일시 ==
* 오후 12시 05분 ~ 12시 45분
* 오후 12시 05분 ~ 1시 30분
== 참가자 ==|| 유재범 || 참석 ||
|| 최다인 || 참석 ||
@@ -9,16 +9,553 @@
|| 김정민 || 참석 ||
== 진행 상황 ==
* 최다인 학우의 발표
== 다음 진행 ==
== 과제 ==
* 위키를 한번 쓰다 날려 내용을 도저히 못쓰겠습니다 - [유재범]
[한자공/시즌3]
== 진행 상황 ==
* 최다인 학우의 발표
* Java의 정석 - Chapter 6-1 클래스
* Java의 정석 - Chapter 6
=== 발표 내용 === * 객체지향 프로그래밍은 절차지향 프로그래밍의 반대개념이 아니다.
* 객체지향에도 절차지향의 개념이 포함되어 있음.
* Class는 일종의 설계도 개념, 설계도로 만들어 낸 제품을 객체, 또는 인스턴스라 함.
* 객체와 인스턴스의 차이
* 책상은 객체이다.
* 책상은 가구 클래스의 인스턴스이다.
* 실제로 생성한 객체 각각을 인스턴스라 부름.
* 객체의 구성
* 1. 속성 / 멤버변수 / 필드
* struct의 구성요소라고 봐도 무관
* 2. 기능 / 메서드 / 함수
* public과 private?
|| 분류 || 접근 지정자 || 클래스 내부 || 같은 패키지 내의 클래스 || 다른 모든 클래스 ||
|| 전용 멤버 || private || O || X || X ||
|| 패키지 멤버 || 없음 || O || O || X ||
|| 공용 멤버 || public || O || O || O ||
* 클래스 작성 -> 인스턴스 생성
* class 클래스명 { } (ex: class TV { ... })
* 클래스명 변수명; (ex: TV tv1;)
* 이 때 생성되는 변수는 인스턴스가 아니다. 생성하는 인스턴스의 주소값을 담을 수 있는 일종의 포인터 변수.
* 변수명 = new 클래스명(); (ex: tv1 = new TV();)
* new를 사용했을 때 인스턴스가 생성되며, 이 때의 주소값을 변수에 대입. 따라서 TV tv1 = new TV(); 처럼 한 문장에 쓸 수도 있다.
* 가비지 콜렉터
{{{
class TV {
...
}
TV tv1 = new TV();
TV tv2 = new TV();
//각각 별개인 두 개의 TV 인스턴스 생성
tv2 = tv1;
//tv2가 가리키는 인스턴스를 tv1이 가리키고있는 TV 인스턴스로 변경.
//이 때, 원래 tv2가 가리키고 있던 인스턴스는 사용하지 않는 상태가 되므로, JAVA의 가비지 콜렉터가 자동으로 메모리를 해제한다.
}}}
* 객체지향의 기본 개념 중 하나 : 구현의 세부 사항을 클래스 안에 감추어라.
* public 필드는 되도록 피해야한다.
* 필드에 직접 접근하는 방법보다는, 클래스에 메소드를 추가하여 필드에 대한 접근을 선별적으로 승인해야 한다.
* 필드와 관련된 두 종류의 메소드
* 접근자
* 보통 get을 메소드 이름 앞에 붙임
* 생성자
* 보통 set을 메소드 이름 앞에 붙임
* 장점
* 잘못된 값이 대입되는 것을 방지할 수 있다.
* 값이 바뀌면 안되는 필드의 경우, 생성자를 만들지 않음으로 자동적으로 읽기만 가능하게 할 수 있다.
{{{
//접근자 생성자 예시
class Car {
private String color;
public String getColor() {
return color;
} //접근자
public void setColor(String c) {
color = c;
} //생성자
}}}
* 기초형과 참조형
* 메소드의 매개변수가 기초형 변수일 경우, 값이 복사
* 참조형 변수일 경우에도 값이 복사되나, 그 값이 주소값이기 때문에 가리키는 객체의 값을 바꿀 수 있다.
* '''주의!''' 객체가 복사되는 것이 아니라는 것을 기억
* 이를 응용해, 배열이 참조형이라는 것을 이용하여 크기가 1짜리 배열을 만들어서 포인터처럼 쓸 수 있음...
* 가변 길이 인수
* 메소드로 전달된 인수의 정확한 개수를 알 수 없을 때 쓰임.
* 예제 (출처 : POWER JAVA 2판)
{{{
class Test {
void sub(int... v) {
System.out.println("인수의 개수 : " + v.length);
for (int x : v)
System.out.print(x + " ");
System.out.println();
}
}
public class VarArgsTest {
public static void main(String args[]) {
Test c = new Test();
c.sub(1);
c.sub(2, 3, 4, 5, 6);
c.sub();
}
}
/*
실행 결과
인수의 개수 : 1
1
인수의 개수 : 5
2 3 4 5 6
인수의 개수 : 0
*/
}}}
* static
* static으로 선언한 변수와 메소드는 '''클래스가 메모리에 올라갈 때''' 생성된다.
* 그 외의 것은 '''인스턴스 생성 시''' 함께 생성된다.
* static VarType VarName; -> 클래스 변수
* 클래스가 메모리에 올라갈 때 한 번 생성되므로, 나중에 몇 개의 인스턴스를 만들더라도 모든 인스턴스들이 한 가지 값을 공유하게 된다.
* static FuncType FuncName () {} -> 클래스 메서드
* 클래스가 메모리에 올라갈 때 생성되므로, 인스턴스를 생성하지 않더라도 사용할 수 있다.
* static으로 선언되지 않은 것들은 각각 인스턴스 변수, 인스턴스 메서드라고 불림.
* 얘네는 인스턴스를 생성해야 생성되기 때문에 인스턴스를 생성하지 않으면 사용 불가.
* 따라서, 클래스 메서드에서 인스턴스 변수를 사용할 경우 에러가 나게 된다.
* 클래스 메서드가 메모리에 올라갈 때, 인스턴스 변수는 선언되지 않은 상태이기 때문.
* 즉, 인스턴스들이 어떤 속성을 공유해야 할 필요성이 있을 때는 static 변수를 사용하고, 인스턴스를 생성하지 않고 사용하고 싶은 (예 : Math 클래스) 메서드는 static 메서드를 사용하자.
* 또한 메서드 안에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려해보자.
* 선언이 한 번만 되기 때문에, 메모리를 아낄 수 있다? 속도가 빨라진다? 뭐였더라... 아무튼 이득.
* public static void main 을 생각하면 편함 ㅎㅎ
* 메서드 오버로딩
* 이름이 같고, 매개변수의 개수나 타입이 다른 메서드는 오버로딩된다. ('''메서드의 리턴타입은 관계가 없다!''')
{{{
//method overloading
public int square(int i) { return i*i; }
public double square(double i) { return i*i; }
}}}
* 장점 : 같은 기능을 하는 메소드들의 이름을 같게 지어, 번거로움을 줄일 수 있다.
* 생성자
* 객체를 생성하면, 객체의 데이터를 초기값으로 설정하는 작업을 한다.
* 이러한 작업을 위하여 생성자라는 특수한 메소드가 필요!
* 생성자는 일반 메소드와 흡사하나, 메소드 이름이 클래스 이름과 같고 반환값을 가지지 않으며, 반드시 public을 붙여야 한다.
* 한 클래스 안에 여러개의 생성자를 overloading 하는 것도 가능하다.
{{{
//예시
class Car {
private String color;
private int speed;
private int gear;
public Car(String c, int s, int g) {
color = c;
speed = s;
gear = g;
}
public Car() {
color = "red";
speed = 0;
gear = 1;
}
}
public class CarTest {
public static void main(String args[]) {
Car c1 = new Car("blue", 100, 0);
Car c2 = new Car();
}
}
}}}
* 클래스 내에 생성자를 적지 않는 경우, 자동적으로 default 생성자가 만들어짐.
* default 생성자는 비어있음.
* public car () { }
* '''주의!''' 생성자가 하나라도 있다면, 디폴트 생성자는 만들어지지 않는다.
* 따라서 위의 예시에서 public Car() { ... } 생성자를 삭제할 경우, Car c2 = new Car(); 부에서 오류가 나게 된다.
* 생성자에서 다른 생성자를 호출하기
* 생성자는 비슷한 초기화 작업을 수행하기 때문에 하나의 생성자에서 다른 생성자를 호출하는 경우가 많음
* 기존의 생성자를 호출할 때는 this() 라는 예약어를 사용한다.
* '''주의!''' 다른 생성자를 호출하는 문장은 생성자의 맨 첫 번째 문장이어야 한다!
{{{
class Car {
private String color;
private int speed;
private int gear;
public Car(String c, int s, int g) {
color = c;
speed = s;
gear = g;
}
public Car(String c) {
this(c, 0, 1);
}
}
}}}
* this 참조
* 모든 객체는 키워드 this를 사용하여 자기 자신을 참조할 수 있다.
* 필드의 이름과 메소드 매개변수의 이름이 동일한 경우, 구분하기 위하여 사용
{{{
public void setSpeed(int speed)
{
this.speed = speed; //speed는 매개변수, this.speed는 필드
}
}}}
* 메소드 몸체에서 필드나 메소드를 좀 더 확실하게 하려고 할 때 사용
{{{
public Time(int h, int m, int s) {
this.setTime(h, m, s); //this는 없어도 된다.
}
}}}
* 메소드 매개변수로 자기 자신에 대한 참조를 넘겨야할 필요가 있는 경우에 사용
{{{
System.out.println(this);
}}}
* ~~왜 클래스 이름을 안쓰고 this라고 하나요?~~
* ~~재범이 밥먹어쪄요라고 안하잖아요~~
== 다음 진행 ==
* Chapter 8
* 상속
* Chapter 7
* 객체지향 프로그래밍 2
* 발표 : [김용준]== 과제 ==
* [https://www.google.co.kr/url?sa=t&source=web&rct=j&ei=rtHFU7XxMMXk8AXSq4LwCQ&url=http://fortune94.tistory.com/attachment/cfile10.uf%40223FCA45524E568F2C46C1.pdf&cd=3&ved=0CCYQFjAC&usg=AFQjCNFN4ldn4rztksHRCooww_mF_0vzaA&sig2=si4JLRUgqS_1qN0Ca_mk5Q 다운로드 링크] 과제 2번까지.
=== 유재범 ===
과제 1
{{{
package hanjagonghomework;
import java.io.*;
public class Product {
BufferedReader in;
int price;
String name = "";
public Product(){
this.in = new BufferedReader(new InputStreamReader(System.in));
price = 10000;
name = "SAMSUNG";
}
public Product(int price, String name){
this.price = price;
this.name = name;
}
public Product(int price){
this.price = price;
}
public Product(String name){
this.name = name;
}
public String getName(){
return name;
}
public int getPrice(){
return price;
}
public void setName(String name){
this.name = name;
}
public void setPrice(int price){
this.price=price;
}
public void Print(){
System.out.println("이름 : " + name);
System.out.println("가격 : " + price);
}
}
}}}
과제 2
{{{
package hanjagonghomework;
import java.io.*;
public class MP3 {
BufferedReader in;
String company;
int size;
public MP3(String company, int size){
this.company = company;
this.size = size;
}
public MP3(String company){
this.company = company;
}
public MP3(){
this.in = new BufferedReader(new InputStreamReader(System.in));
this.company = "I-Pot";
this.size = 2;
}
public String getCompany(){
return company;
}
public int getSize(){
return size;
}
public void setCompany(String company){
this.company = company;
}
public void setSize(int size){
this.size = size;
}
public void Print(){
System.out.println("회사 : " + company);
System.out.println("용량 : " + size + "Gb");
}
}
}}}
출력 클래스
{{{
package hanjagonghomework;
import java.io.*;
public class Homework0714 {
public static void main(String []ar) throws IOException{
System.out.println("Product");
Product rd = new Product(5000, "LG");
rd.Print();
rd.setPrice(1000);
rd.getPrice();
rd.setName("삼성");
rd.getName();
rd.Print();
System.out.println("MP3");
MP3 af = new MP3();
af.Print();
af.setCompany("아이리버");
af.setSize(6);
af.getCompany();
af.getSize();
af.Print();
}
}
}}}
=== 최다인 ===
=== 이지수 ===
과제 1
{{{
public class ProductTest{
public static void main(String[] ar){
Product obj1 = new Product();
Product obj2 = new Product(1000);
Product obj3 = new Product("cheetose");
Product obj4 = new Product("diagestive", 1500);
obj1.setPrice(500);
obj1.setName("eggmong");
System.out.println(obj1.getName() + obj1.getPrice());
obj2.setName("pepero");
System.out.println(obj2.getName() + obj2.getPrice());
obj3.setPrice(1500);
System.out.println(obj3.getName() + obj3.getPrice());
System.out.println(obj4.getName() + obj4.getPrice());
}
}
class Product{
String name;
int price;
public Product(String name, int price){
this.name = name;
this.price = price;
}
public Product(String name){
this.name = name;
}
public Product(int price){
this.price = price;
}
public Product(){
}
String getName(){
return this.name;
}
int getPrice(){
return this.price;
}
void setName(String name){
this.name = name;
}
void setPrice(int price){
this.price = price;
}
}
}}}
과제 2
{{{
public class MP3test{
public static void main(String[] ar){
MP3 obj1 = new MP3();
MP3 obj2 = new MP3("LG");
MP3 obj3 = new MP3("samsung", "50GB");
System.out.println(obj1.company + " " + obj1.size);
obj2.setSize("7GB");
System.out.println(obj2.company + " " + obj2.getSize());
System.out.println(obj3.company + " " + obj3.size);
}
}
class MP3{
String company;
String size;
public MP3(String company, String size){
this.company = company;
this.size = size;
}
public MP3(String company){
this.company = company;
}
public MP3(){
company = "아이팟";
size = "2GB";
}
String getCompany(){
return company;
}
String getSize(){
return size;
}
void setCompany(String company){
this.company = company;
}
void setSize(String size){
this.size = size;
}
}
}}}
=== 김용준 ===
* 과제 1
{{{
package test04;
public class ProductTest {
public static void main(String[] args) {
}
}
class Product{
private String name;
private int price;
public Product(String name, int price){
this.name = name;
this.price = price;
}
public Product(String name){
this.name = name;
}
public Product(int price){
this.price = price;
}
public Product(){}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getPrice(){
return price;
}
public void setPrice(int price){
this.price = price;
}
}
}}}
* 과제 2
{{{
package test04;
public class MP3test {
public static void main(String[] args) {
}
}
class MP3{
private String company = "아이팟";
private int size = 2048;//2G
public MP3(String company, String size){
this.company = company;
this.size = Integer.valueOf(size);
}
public MP3(String company){
this.company = company;
}
public MP3(){}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public void pirnt(){
System.out.println("company : "+this.company);
System.out.println("size : "+this.size);
}
}
}}}
----
=== 김정민 ===
== 후기 ==* 위키를 한번 쓰다 날려 내용을 도저히 못쓰겠습니다 - [유재범]
* 내가 대략 정리해서 써놓을게 ㅡㅡㅋ -[최다인]
* get,set을 Source -> Generate Getters and Setters...를 사용하면 자동으로 만들 수 있습니당. - [김용준]
* 그리고 슬슬 과제페이지를 따로 만들어서 들어가서 보도록 만들어야할꺼 같아요. - [김용준]
* 나중에 날 잡아서 git 사용법을 다시 알아보도록 할까요? 데블스때 들은게 슬슬 산화해가는 느낌이.. - [유재범]
* 생성자 자동 생성 Source -> Generate Constructor using Fields - [김용준]
* 저희 과제 출력 클래스도 만들어야 하는건가요? - [유재범]
* 다인 선배님 강의에 중첩 클래스에 대한 내용은 없는 것 같은데 혹시 다른 사람들 책에 중첩 클래스 내용이 없나요? - [유재범]
-----[한자공/시즌3]
3.1. 발표 내용 ¶
- 객체지향 프로그래밍은 절차지향 프로그래밍의 반대개념이 아니다.
- 객체지향에도 절차지향의 개념이 포함되어 있음.
- 객체지향에도 절차지향의 개념이 포함되어 있음.
- Class는 일종의 설계도 개념, 설계도로 만들어 낸 제품을 객체, 또는 인스턴스라 함.
- 객체와 인스턴스의 차이
- 책상은 객체이다.
- 책상은 가구 클래스의 인스턴스이다.
- 실제로 생성한 객체 각각을 인스턴스라 부름.
- 실제로 생성한 객체 각각을 인스턴스라 부름.
- 책상은 객체이다.
- 객체와 인스턴스의 차이
- 객체의 구성
- 1. 속성 / 멤버변수 / 필드
- struct의 구성요소라고 봐도 무관
- struct의 구성요소라고 봐도 무관
- 2. 기능 / 메서드 / 함수
- public과 private?
- 1. 속성 / 멤버변수 / 필드
분류 | 접근 지정자 | 클래스 내부 | 같은 패키지 내의 클래스 | 다른 모든 클래스 |
전용 멤버 | private | O | X | X |
패키지 멤버 | 없음 | O | O | X |
공용 멤버 | public | O | O | O |
- 클래스 작성 -> 인스턴스 생성
- class 클래스명 { } (ex: class TV { ... })
- 클래스명 변수명; (ex: TV tv1;)
- 이 때 생성되는 변수는 인스턴스가 아니다. 생성하는 인스턴스의 주소값을 담을 수 있는 일종의 포인터 변수.
- 이 때 생성되는 변수는 인스턴스가 아니다. 생성하는 인스턴스의 주소값을 담을 수 있는 일종의 포인터 변수.
- 변수명 = new 클래스명(); (ex: tv1 = new TV();)
- new를 사용했을 때 인스턴스가 생성되며, 이 때의 주소값을 변수에 대입. 따라서 TV tv1 = new TV(); 처럼 한 문장에 쓸 수도 있다.
- new를 사용했을 때 인스턴스가 생성되며, 이 때의 주소값을 변수에 대입. 따라서 TV tv1 = new TV(); 처럼 한 문장에 쓸 수도 있다.
- class 클래스명 { } (ex: class TV { ... })
- 가비지 콜렉터
class TV { ... } TV tv1 = new TV(); TV tv2 = new TV(); //각각 별개인 두 개의 TV 인스턴스 생성 tv2 = tv1; //tv2가 가리키는 인스턴스를 tv1이 가리키고있는 TV 인스턴스로 변경. //이 때, 원래 tv2가 가리키고 있던 인스턴스는 사용하지 않는 상태가 되므로, JAVA의 가비지 콜렉터가 자동으로 메모리를 해제한다.
- 객체지향의 기본 개념 중 하나 : 구현의 세부 사항을 클래스 안에 감추어라.
- public 필드는 되도록 피해야한다.
- 필드에 직접 접근하는 방법보다는, 클래스에 메소드를 추가하여 필드에 대한 접근을 선별적으로 승인해야 한다.
- 필드와 관련된 두 종류의 메소드
- 접근자
- 보통 get을 메소드 이름 앞에 붙임
- 보통 get을 메소드 이름 앞에 붙임
- 생성자
- 보통 set을 메소드 이름 앞에 붙임
- 보통 set을 메소드 이름 앞에 붙임
- 접근자
- 장점
- 잘못된 값이 대입되는 것을 방지할 수 있다.
- 값이 바뀌면 안되는 필드의 경우, 생성자를 만들지 않음으로 자동적으로 읽기만 가능하게 할 수 있다.
- 잘못된 값이 대입되는 것을 방지할 수 있다.
- public 필드는 되도록 피해야한다.
//접근자 생성자 예시 class Car { private String color; public String getColor() { return color; } //접근자 public void setColor(String c) { color = c; } //생성자
- 기초형과 참조형
- 메소드의 매개변수가 기초형 변수일 경우, 값이 복사
- 참조형 변수일 경우에도 값이 복사되나, 그 값이 주소값이기 때문에 가리키는 객체의 값을 바꿀 수 있다.
- 주의! 객체가 복사되는 것이 아니라는 것을 기억
- 주의! 객체가 복사되는 것이 아니라는 것을 기억
- 이를 응용해, 배열이 참조형이라는 것을 이용하여 크기가 1짜리 배열을 만들어서 포인터처럼 쓸 수 있음...
- 메소드의 매개변수가 기초형 변수일 경우, 값이 복사
- 가변 길이 인수
- 메소드로 전달된 인수의 정확한 개수를 알 수 없을 때 쓰임.
- 예제 (출처 : POWER JAVA 2판)
- 메소드로 전달된 인수의 정확한 개수를 알 수 없을 때 쓰임.
class Test { void sub(int... v) { System.out.println("인수의 개수 : " + v.length); for (int x : v) System.out.print(x + " "); System.out.println(); } } public class VarArgsTest { public static void main(String args[]) { Test c = new Test(); c.sub(1); c.sub(2, 3, 4, 5, 6); c.sub(); } } /* 실행 결과 인수의 개수 : 1 1 인수의 개수 : 5 2 3 4 5 6 인수의 개수 : 0 */
- static
- static으로 선언한 변수와 메소드는 클래스가 메모리에 올라갈 때 생성된다.
- 그 외의 것은 인스턴스 생성 시 함께 생성된다.
- static VarType VarName; -> 클래스 변수
- 클래스가 메모리에 올라갈 때 한 번 생성되므로, 나중에 몇 개의 인스턴스를 만들더라도 모든 인스턴스들이 한 가지 값을 공유하게 된다.
- 클래스가 메모리에 올라갈 때 한 번 생성되므로, 나중에 몇 개의 인스턴스를 만들더라도 모든 인스턴스들이 한 가지 값을 공유하게 된다.
- static FuncType FuncName () {} -> 클래스 메서드
- 클래스가 메모리에 올라갈 때 생성되므로, 인스턴스를 생성하지 않더라도 사용할 수 있다.
- 클래스가 메모리에 올라갈 때 생성되므로, 인스턴스를 생성하지 않더라도 사용할 수 있다.
- static으로 선언되지 않은 것들은 각각 인스턴스 변수, 인스턴스 메서드라고 불림.
- 얘네는 인스턴스를 생성해야 생성되기 때문에 인스턴스를 생성하지 않으면 사용 불가.
- 따라서, 클래스 메서드에서 인스턴스 변수를 사용할 경우 에러가 나게 된다.
- 클래스 메서드가 메모리에 올라갈 때, 인스턴스 변수는 선언되지 않은 상태이기 때문.
- 클래스 메서드가 메모리에 올라갈 때, 인스턴스 변수는 선언되지 않은 상태이기 때문.
- 얘네는 인스턴스를 생성해야 생성되기 때문에 인스턴스를 생성하지 않으면 사용 불가.
- 즉, 인스턴스들이 어떤 속성을 공유해야 할 필요성이 있을 때는 static 변수를 사용하고, 인스턴스를 생성하지 않고 사용하고 싶은 (예 : Math 클래스) 메서드는 static 메서드를 사용하자.
- 또한 메서드 안에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려해보자.
- 선언이 한 번만 되기 때문에, 메모리를 아낄 수 있다? 속도가 빨라진다? 뭐였더라... 아무튼 이득.
- 선언이 한 번만 되기 때문에, 메모리를 아낄 수 있다? 속도가 빨라진다? 뭐였더라... 아무튼 이득.
- public static void main 을 생각하면 편함 ㅎㅎ
- static으로 선언한 변수와 메소드는 클래스가 메모리에 올라갈 때 생성된다.
- 메서드 오버로딩
- 이름이 같고, 매개변수의 개수나 타입이 다른 메서드는 오버로딩된다. (메서드의 리턴타입은 관계가 없다!)
- 이름이 같고, 매개변수의 개수나 타입이 다른 메서드는 오버로딩된다. (메서드의 리턴타입은 관계가 없다!)
//method overloading public int square(int i) { return i*i; } public double square(double i) { return i*i; }
- 장점 : 같은 기능을 하는 메소드들의 이름을 같게 지어, 번거로움을 줄일 수 있다.
- 생성자
- 객체를 생성하면, 객체의 데이터를 초기값으로 설정하는 작업을 한다.
- 이러한 작업을 위하여 생성자라는 특수한 메소드가 필요!
- 생성자는 일반 메소드와 흡사하나, 메소드 이름이 클래스 이름과 같고 반환값을 가지지 않으며, 반드시 public을 붙여야 한다.
- 한 클래스 안에 여러개의 생성자를 overloading 하는 것도 가능하다.
- 객체를 생성하면, 객체의 데이터를 초기값으로 설정하는 작업을 한다.
//예시 class Car { private String color; private int speed; private int gear; public Car(String c, int s, int g) { color = c; speed = s; gear = g; } public Car() { color = "red"; speed = 0; gear = 1; } } public class CarTest { public static void main(String args[]) { Car c1 = new Car("blue", 100, 0); Car c2 = new Car(); } }
- 클래스 내에 생성자를 적지 않는 경우, 자동적으로 default 생성자가 만들어짐.
- default 생성자는 비어있음.
- public car () { }
- 주의! 생성자가 하나라도 있다면, 디폴트 생성자는 만들어지지 않는다.
- 따라서 위의 예시에서 public Car() { ... } 생성자를 삭제할 경우, Car c2 = new Car(); 부에서 오류가 나게 된다.
- 따라서 위의 예시에서 public Car() { ... } 생성자를 삭제할 경우, Car c2 = new Car(); 부에서 오류가 나게 된다.
- default 생성자는 비어있음.
- 생성자에서 다른 생성자를 호출하기
- 생성자는 비슷한 초기화 작업을 수행하기 때문에 하나의 생성자에서 다른 생성자를 호출하는 경우가 많음
- 기존의 생성자를 호출할 때는 this() 라는 예약어를 사용한다.
- 주의! 다른 생성자를 호출하는 문장은 생성자의 맨 첫 번째 문장이어야 한다!
- 주의! 다른 생성자를 호출하는 문장은 생성자의 맨 첫 번째 문장이어야 한다!
- 생성자는 비슷한 초기화 작업을 수행하기 때문에 하나의 생성자에서 다른 생성자를 호출하는 경우가 많음
class Car { private String color; private int speed; private int gear; public Car(String c, int s, int g) { color = c; speed = s; gear = g; } public Car(String c) { this(c, 0, 1); } }
- this 참조
- 모든 객체는 키워드 this를 사용하여 자기 자신을 참조할 수 있다.
- 필드의 이름과 메소드 매개변수의 이름이 동일한 경우, 구분하기 위하여 사용
- 모든 객체는 키워드 this를 사용하여 자기 자신을 참조할 수 있다.
public void setSpeed(int speed) { this.speed = speed; //speed는 매개변수, this.speed는 필드 }
- 메소드 몸체에서 필드나 메소드를 좀 더 확실하게 하려고 할 때 사용
public Time(int h, int m, int s) { this.setTime(h, m, s); //this는 없어도 된다. }
- 메소드 매개변수로 자기 자신에 대한 참조를 넘겨야할 필요가 있는 경우에 사용
System.out.println(this);
왜 클래스 이름을 안쓰고 this라고 하나요?
재범이 밥먹어쪄요라고 안하잖아요
5.1. 유재범 ¶
과제 1
package hanjagonghomework; import java.io.*; public class Product { BufferedReader in; int price; String name = ""; public Product(){ this.in = new BufferedReader(new InputStreamReader(System.in)); price = 10000; name = "SAMSUNG"; } public Product(int price, String name){ this.price = price; this.name = name; } public Product(int price){ this.price = price; } public Product(String name){ this.name = name; } public String getName(){ return name; } public int getPrice(){ return price; } public void setName(String name){ this.name = name; } public void setPrice(int price){ this.price=price; } public void Print(){ System.out.println("이름 : " + name); System.out.println("가격 : " + price); } }
과제 2
package hanjagonghomework; import java.io.*; public class MP3 { BufferedReader in; String company; int size; public MP3(String company, int size){ this.company = company; this.size = size; } public MP3(String company){ this.company = company; } public MP3(){ this.in = new BufferedReader(new InputStreamReader(System.in)); this.company = "I-Pot"; this.size = 2; } public String getCompany(){ return company; } public int getSize(){ return size; } public void setCompany(String company){ this.company = company; } public void setSize(int size){ this.size = size; } public void Print(){ System.out.println("회사 : " + company); System.out.println("용량 : " + size + "Gb"); } }
출력 클래스
package hanjagonghomework; import java.io.*; public class Homework0714 { public static void main(String []ar) throws IOException{ System.out.println("Product"); Product rd = new Product(5000, "LG"); rd.Print(); rd.setPrice(1000); rd.getPrice(); rd.setName("삼성"); rd.getName(); rd.Print(); System.out.println("MP3"); MP3 af = new MP3(); af.Print(); af.setCompany("아이리버"); af.setSize(6); af.getCompany(); af.getSize(); af.Print(); } }
5.3. 이지수 ¶
과제 1
public class ProductTest{ public static void main(String[] ar){ Product obj1 = new Product(); Product obj2 = new Product(1000); Product obj3 = new Product("cheetose"); Product obj4 = new Product("diagestive", 1500); obj1.setPrice(500); obj1.setName("eggmong"); System.out.println(obj1.getName() + obj1.getPrice()); obj2.setName("pepero"); System.out.println(obj2.getName() + obj2.getPrice()); obj3.setPrice(1500); System.out.println(obj3.getName() + obj3.getPrice()); System.out.println(obj4.getName() + obj4.getPrice()); } } class Product{ String name; int price; public Product(String name, int price){ this.name = name; this.price = price; } public Product(String name){ this.name = name; } public Product(int price){ this.price = price; } public Product(){ } String getName(){ return this.name; } int getPrice(){ return this.price; } void setName(String name){ this.name = name; } void setPrice(int price){ this.price = price; } }
과제 2
public class MP3test{ public static void main(String[] ar){ MP3 obj1 = new MP3(); MP3 obj2 = new MP3("LG"); MP3 obj3 = new MP3("samsung", "50GB"); System.out.println(obj1.company + " " + obj1.size); obj2.setSize("7GB"); System.out.println(obj2.company + " " + obj2.getSize()); System.out.println(obj3.company + " " + obj3.size); } } class MP3{ String company; String size; public MP3(String company, String size){ this.company = company; this.size = size; } public MP3(String company){ this.company = company; } public MP3(){ company = "아이팟"; size = "2GB"; } String getCompany(){ return company; } String getSize(){ return size; } void setCompany(String company){ this.company = company; } void setSize(String size){ this.size = size; } }
5.4. 김용준 ¶
- 과제 1
package test04; public class ProductTest { public static void main(String[] args) { } } class Product{ private String name; private int price; public Product(String name, int price){ this.name = name; this.price = price; } public Product(String name){ this.name = name; } public Product(int price){ this.price = price; } public Product(){} public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getPrice(){ return price; } public void setPrice(int price){ this.price = price; } }
- 과제 2
package test04; public class MP3test { public static void main(String[] args) { } } class MP3{ private String company = "아이팟"; private int size = 2048;//2G public MP3(String company, String size){ this.company = company; this.size = Integer.valueOf(size); } public MP3(String company){ this.company = company; } public MP3(){} public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public void pirnt(){ System.out.println("company : "+this.company); System.out.println("size : "+this.size); } }
6. 후기 ¶
- 위키를 한번 쓰다 날려 내용을 도저히 못쓰겠습니다 - 유재범
- 내가 대략 정리해서 써놓을게 ㅡㅡㅋ -최다인
- 내가 대략 정리해서 써놓을게 ㅡㅡㅋ -최다인
- get,set을 Source -> Generate Getters and Setters...를 사용하면 자동으로 만들 수 있습니당. - 김용준
- 그리고 슬슬 과제페이지를 따로 만들어서 들어가서 보도록 만들어야할꺼 같아요. - 김용준
- 나중에 날 잡아서 git 사용법을 다시 알아보도록 할까요? 데블스때 들은게 슬슬 산화해가는 느낌이.. - 유재범
- 나중에 날 잡아서 git 사용법을 다시 알아보도록 할까요? 데블스때 들은게 슬슬 산화해가는 느낌이.. - 유재범
- 생성자 자동 생성 Source -> Generate Constructor using Fields - 김용준
- 저희 과제 출력 클래스도 만들어야 하는건가요? - 유재범
- 다인 선배님 강의에 중첩 클래스에 대한 내용은 없는 것 같은데 혹시 다른 사람들 책에 중첩 클래스 내용이 없나요? - 유재범