[[TableOfContents]] == 일시 == * 오후 12시 05분 ~ 1시 00분 == 참가자 == || 유재범 || 참석 || || 최다인 || 참석 || || 이지수 || 참석 || || 김용준 || 참석 || || 김정민 || 참석 || == 진행 상황 == * 최다인 학우의 발표 * 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 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번까지. === 유재범 === === 최다인 === === 이지수 === === 김용준 === === 김정민 === == 후기 == * 위키를 한번 쓰다 날려 내용을 도저히 못쓰겠습니다 - [유재범] * 내가 대략 정리해서 써놓을게 ㅡㅡㅋ -[최다인] ----- [한자공/시즌3]