명품자바프로그래밍 4장 요약
클래스와 객체
객체 지향 언어의 특징 3가지
캡슐화 : 클래스라는 캡슐을 사용하며 필드(멤버변수)와 메소드(멤버함수)로 구성된다.
상속 : 자식클래스(sub class)가 부모 클래스(super class)의 속성을 물려받아 사용하고 기능을 추가(extends) 하는 것.
다형성 : 같은 이름의 메소드가 클래스나 객체에 따라 다르게 동작하도록 구현되는 것.
- overriding 오버라이딩 : 슈퍼클래스를 서브클래스에서 동일한 이름으로 자신의 특징에 맞게 재구현하는 것
- overloading 오버로딩 : 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러개 만드는 것
객체 지향 언어의 목적
소프트웨어의 생산성 향상, 실세계에 대한 쉬운 모델링
객체 : 클래스 모양대로 생성된 실체. 클래스의 인스턴스 instance. 사례
클래스 : 객체를 만들기 위한 설계도.
멤버 : 클래스의 구성 요소. 필드와 메소드 두 종류가 있다.
필드 : 객체 내 값을 저장할 멤버 변수
메소드 : 함수이며 객체의 행동을 구현
접근 지정자 access specifier
접근의 범위 지정. public, private, protected, default.
생성자 constructor
- new를 통해 객체가 생성될 때 자동으로 한번만 호출.
- 객체 초기화를 위해 실행되는 클래스의 이름과 동일한 메소드.
- 오버로딩 : 매개변수의 개수와 타입만 다르다면 클래스 내에 생성자를 여러 개 둘 수 있다.
- 리턴 타입을 지정할 수 없다. public Circle() {...} (x) void(x) return;(0)
디폴트 생성자 default constructor
매개변수와 실행코드가 없어 아무 일도 하지 않고 단순리턴하는 생성자
* 객체가 생성될 때 반드시 실행되기에 생성자가 없는 클래스는 없다.
-> 생성자가 하나도 없으면 컴파일러가 생성자를 자동 생성하여 컴파일러 오류가 호출되지 않음
* 생성자가 하나라도 존재하면 기본생성자가 자동으로 삽입되지 않음
-> 컴파일오류 발생
class Circle{
public Circle(){} //기본생성자(디폴트생성자). 단순 리턴만 함
}
레퍼런스 변수 선언 : null로 초기화된다.
Circle 타입 크기의 메모리 할당 -> Circle() 생성자 코드 실행
Circle pizza=new Circle();
Circle pizza; //레퍼런스를 가지는 변수일 뿐 아직 객체가 생성된 것이 아니다.
pizza=new Circle(); //객체 생성은 new 연산자를 사용해서 객체를 생성한다.
객체 멤버 접근 : 레퍼런스 변수 뒤 점 연산자를 붙인다.
pizza.radius=10; //pizza 객체의 radius 필드에 10 대입
int r=pizza.radius; //pizza 객체의 radius 필드값 읽을 때
this 레퍼런스 : 객체 자신을 가리키는 레퍼런스. 메소드에서 사용되며 현재 실행되고 있는 메소드가 속한 객체에 대한 참조로 컴파일러에 의해 자동 관리된다. static에서는 사용될 수 없다.
public Circle(int radius) {this.radius=radius;}
// 멤버, 매개변수
public Circle getMe() {return this;} //객체 자신의 레퍼런스 리턴
this() : 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용되는 자바코드.
반드시 생성자 코드에서만 호출, 같은 클래스 내 다른 생성자 호출 시 사용, 생성자의 첫 번째 문장
객체 배열 : 기본 타입 데이터 외 객체에 대한 레퍼런스를 원소로 갖는 배열
Circle[] c; //배열에 대한 레퍼런스 선언
c=new Circle[5]; //Circle 객체에 대한 레퍼런스 생성
for(int i=0; i<c.length; i++) //c.length는 배열 c의 크기(5)
c[i]=new Circle(i); //i번째 Circle 객체 생성
명품자바프로그래밍 클래스와 객체 4장 예제
| 예제 4-1 | 반지름과 이름을 가진 Circle 클래스를 작성하고, Circle 클래스의 객체를 생성하라. 그리고 객체가 생성된 모습을 그려보라.
* No enclosing instance of type ... is accessible 컴파일 오류 : 보통 내부에 있는 클래스를 static 함수를 참조할 때 에러
>> 자바피자의 면적은 314.0, 등킨드나쓰의 면적은 12.56
package Luxuryjava04;
public class Circle {
int radius; //원의 반지름필드
String name; //원의 이름필드
public Circle() { } //생성
public double getArea() {
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle pizza; //참조변수 피자 선언
pizza=new Circle(); //원 객체 생성
pizza.radius=10; //피자 반지름 설정
pizza.name="자바피자"; // 피자 이름설정
double area=pizza.getArea(); //피자 면적알기
System.out.println(pizza.name+"의면적은"+area);
Circle donut=new Circle(); //원 객체 생성
donut.radius=2; //도넛 반지름 설정
donut.name="등킨드나쓰"; //도넛 이름설정
area=donut.getArea(); //도넛 면적알기
System.out.println(donut.name+"의면적은"+area);
}
}
| 예제 4-2 | 너비와 높이를 입력받아 사각형의 합을 출력하는 프로그램을 작성하라. 너비와 높이 필드, 그리고 면적 값을 제공하는 getArea() 메소드를 가진 Rectangle 클래스를 만들어 활용하라. *객체는 new 연산자로 생성하고, .쩜 연산자로 멤버를 접근한다.
>> 4 5
사각형의 면적은 20
package Luxuryjava04;
import java.util.Scanner;
class Rectangle{
int width, height;
public int getArea() {
return width*height;
}
}
public class RectApp {
public static void main(String[] args) {
Rectangle rect=new Rectangle(); //객체 생성
Scanner s=new Scanner(System.in);
System.out.print(">>");
rect.width=s.nextInt();
rect.height=s.nextInt();
System.out.println("사각형의 면적은 "+rect.getArea());
s.close();
}
}
| 예제 4-3 | 다음 코드는 2개의 생성자를 가진 CircleA 클래스다. 실행 결과는?
>> javapizza의 면적은 314.0
oraclepizza의 면적은 3.14
package Luxuryjava04;
public class CircleA {
int radius;
String name;
//생성자는 클래스 이름과 동일
public CircleA() { //매개변수 없는 생성자
radius=1; name=""; // field 초기화
}
//생성자는 리턴타입 없음
public CircleA(int r, String n) { //매개변수를 가진 생성자
radius=r; name=n; //매개변수로 필드 초기화
}
public double getArea() {
return 3.14*radius*radius;
}
public static void main(String[] args) {
CircleA pizza=new CircleA(10, "javapizza");
//객체 생성,반지름과 이름 초기화
double area=pizza.getArea();
System.out.println(pizza.name+"의 면적은 "+area);
CircleA donut=new CircleA(); //객체 생성,반지름과 이름 초기화
donut.name="oraclepizza"; //이름변경
area=donut.getArea();
System.out.println(donut.name+"의 면적은 "+area);
}
}
| 예제 4-4 | 제목과 저자를 나타내는 title과 author필드를 가진 Book 클래스를 작성하고, 생성자를 작성하여 필드를 초기화하라.
>> 어린왕자 생텍쥐페리
춘향뎐 작자미상
package Luxuryjava04;
public class Book {
String title, author;
public Book(String t) { //생성자로 오버로딩.
title=t;
author="작자미상";
}
public Book(String t, String a) { //생성자로 오버로딩. 매개변수의 개수가 다름.
title=t;
author=a;
}
public static void main(String[] args) {
Book littlePrince=new Book("어린왕자", "생텍쥐페리");
Book llovestory=new Book("춘향뎐");
System.out.println(littlePrince.title+" "+littlePrince.author);
System.out.println(llovestory.title+" "+llovestory.author);
}
}
| 예제 4-5 | 4-4에서 작성한 Book클래스의 생성자를 this()를 이용하여 수정하라.
>> 생성자 호출됨
춘향뎐 작자미상
package Luxuryjava04;
public class Book {
String title, author;
void show() {
System.out.println(title+" "+author);
}
public Book() {
this("","");
System.out.println("생성자 호출됨");
}
public Book(String title) {
this(title,"작자미상");
}
public Book(String title, String author) {
this.title=title;
this.author=author;
}
public static void main(String[] args) {
Book littlePrince=new Book("어린왕자", "생텍쥐페리");
Book llovestory=new Book("춘향뎐");
Book emptyBook=new Book();
llovestory.show();
}
}
'Java Friends > Java' 카테고리의 다른 글
명품자바프로그래밍 5장 요약, 예제 (2) | 2019.06.08 |
---|---|
명품자바프로그래밍 4장 연습문제 (0) | 2019.06.08 |
명품자바프로그래밍 3장 실습문제 (0) | 2019.06.08 |
명품자바프로그래밍 3장 연습문제 (0) | 2019.06.08 |
명품자바프로그래밍 3장 요약, 예제 (0) | 2019.06.08 |