예제1)
public class Test1 {
public static void main(String[] args) {
// 객체생성(인스턴스 생성)
Rect ob1=new Rect();
Rect ob2=new Rect();
int a,b;
ob1.width=10; // 직접 인스턴스변수 적용(속성 변화)
ob1.height=5;
a=ob1.area(); // 인스턴스를 이용한 변수 적용(속성 변화)
b=ob1.len();
ob1.print(a,b); // 메서드 호출(기능 실행)
a=ob2.area();
b=ob2.len();
ob2.print(a,b);
}
}
/*
사각형의 넓이와 둘레 계산하는 클래스 작성
1. 추상화
상태(데이터) : 가로,세로
행동(메소드) : 넓이계산,둘레계산,출력
2. 클래스작성
3. 객체생성
*/
class Rect { //디폴트 접근제어
int width, height; // 데이터(인스턴스변수) -> 참조변수가 가리키고 있는 변수를 인스턴스변수라 한다.
int area() { // 행위(메소드)
return width*height;
}
int len(){
return(width+height)*2;
}
void print(int a, int b){
System.out.println("가로:"+width);
System.out.println("세로:"+height);
System.out.println("넓이:"+a);
System.out.println("둘레:"+b);
}
}
예제1 결과)
가로:10
세로:5
넓이:50
둘레:30
가로:0
세로:0
넓이:0
둘레:0
==========================================================================================
예제2_1)
public class Test2 {
public static void main(String[] args){
//객체 생성
//클래스명 객체명 =new 생성자();
//생성자의 역활 : 메모리할당(가장 중요),초기화
Rect2 ob=new Rect2();
// ob.width=10; // 컴파일오류. private는 외부접근 불가. 해당 클래스안에서만 수정가능.
//void 메소드 호출
ob.set(10,20);
//int형 메소드 호출
int a=ob.area();
int b=ob.len();
//인자가 2개인 메소드 호출
ob.print(a, b);
}
}
예제2_2)
/*
class 접근제어 : 디폴트,public.protected,
private(클래스 내부에서만 사용가능)
*/
public class Rect2 {
/*
변수,메소드 접근제어 : 디폴트, public,protected,private
디폴트:아무것도 붙이지 않은 상태(예; Test1.java)
동일한 패키지(폴더)내에서만 접근가능
즉, 동일한 폴더내의 클래스에서 접근 가능
public : 외부어디에서나 접근가능
protected : 동일패키지, 하위클래스에서만 접근가능
private : 외부에서는 접근 불가능(캡슐화).계좌의 잔액에 접근못하게하는 것처럼.
*/
//인스턴스 변수(프로퍼티) -> 초기화하지 않으면 숫자변수는 0(메소드 안의 변수는 초기화를 꼭해줘야하는 것이랑 다르다)
private int width, height;
//메소드:일을 하는 가장 작은 단위
//[접근제어] 리턴타입 메소드명([인수...])
public void set(int w, int h){ // void는 일만 하고 끝난다
width=w;
height=h;
return; //void인 경우만 생략가능
}
public int area(){
return width*height;
}
public int len(){ // void가 아닌경우에는 return을 쓰는데 이아이는 일을하고 자료형값을 넘겨준다.
return(width+height)*2;
}
public void print(int a, int b){
System.out.println("가로:"+width);
System.out.println("세로:"+height);
System.out.println("넓이:"+a);
System.out.println("둘레:"+b);
}
}
예제2 결과) 예제2_2를 컴파일 할 필요없이 예제2_1을 컴파일하면 자동으로 예제2_2가 컴파일된다. 실행 역시 예제2_1만 해주면된다.
가로:10
세로:20
넓이:200
둘레:60
==========================================================================================
예제3) 로또
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.Arrays;
public class Test3 {
public static void main(String[] args) throws IOException {
char ch;
Lotto ob=new Lotto();
while (true){
do{
System.out.print("1.구매 2.종료 ==>");
ch=(char)System.in.read();
System.in.skip(2);
}while (ch<'1' || ch>'2');
switch(ch){
case'1':ob.gameStart();break;
case'2':return;
}
}
}
}
// 위의 메인은 아주 짧다. 보통 이런식이다. 대부분의 소스는 다른 클래스에서 짠다.
class Lotto{
private int[] num=new int[6];
private int count;
public void gameStart() throws IOException {
BufferedReader br=new BufferedReader(
new InputStreamReader(System.in));
do{
System.out.print("구매 갯수?");
count=Integer.parseInt(br.readLine());
}while (count<1 || count>5);
for(int i=1; i<=count; i++) {
lottoNum();
print(i);
}
}
private void lottoNum() {
Random rd=new Random();
for(int i=0; i<6; i++) {
num[i] = rd.nextInt(45)+1;
for(int j=0; j<i; j++) {
if(num[i]==num[j]) {
i--;
break;
}
}
}
//정렬
Arrays.sort(num);
}
private void print(int n){
System.out.print(n+"번째 : ");
for(int i=0; i<num.length; i++)
System.out.printf("%4d", num[i]);
System.out.println();
}
}
예제3 결과)
==========================================================================================
예제4)
public class Test4{
public static void main(String[] args) {
//컴파일 오류. 인스턴스변수, 인스턴스메소드는 객체 생성(메모리할당)이 된 후에 접근할 수 있다.
//Bank.neme="홀길동";
//객체생성
Bank mm=new Bank();
mm.name="홀길동"; // 디폴트 접근제어라 가능하다.
//mm.money=200; // 컴파일오류. private외부 접근불가
int m=mm.draw(50);
if(m==-1)
System.out.println("인출실패 !!!");
else
System.out.println("인출성공 !!!");
System.out.println("남은돈:"+mm.getMoney());
Bank oo=new Bank();
System.out.println("이름:"+oo.name);
System.out.println("남은돈:"+oo.getMoney());
}
}
class Bank{
//인스턴스변수. private : 외부접근불가
private int money=100; // 선언과 동시에 초기화
// 정수형 변수는 초기화히자 않으면 0
// System.out.println("테스트"); //컴파일오류. 선언부에는 실행문이 올 수 없다.
//인스턴스변수. 동일패키지 접근가능
// 레퍼런스변수(클래스형 변수, 배열 등)은 초기화하지 않으면 null로 초기화
String name;
//인스턴스 메소드
public int getMoney() {
return money;
}
public int draw(int m){
if(m>money)
return -1;
money-=m;
return m;
}
//저금
public void saving(int m) {
money+=m;
}
}
예제4 결과)
인출성공 !!!
남은동:50
이름:null
남은돈:100
==========================================================================================
예제5)
public class Test5{
private int num;
//인스턴스메소드
//인스턴스메소드는 객체를 생성(메모리할당)을 해야 사용가능
public int sum() {
int s=0;
for(int i=1; i<=num; i++){
s+=i;
}
return s;
}
public void print(int s) {
System.out.println("1~"+num+"까지 합 :"+s);
}
//클래스메소드.
//클래스메소드는 클래스가 메모리에 로딩된순간 메모리 할당.
public static void main(String[] args) {
//클래스메소드에서는 인스턴스 변수나 인스턴스 메소드를 바로 접근불가. -> 메모리할당이 않되었으기 때문에.
//num=100; //컴파일 오류
//객체 생성 : 인스턴스변수, 인스턴스메소드 메모리 할당
// 언제메모리 제거가 될까? 가비지셀렉터가 알아서 종료.
Test5 oo=new Test5();
oo.num=100;
int s=oo.sum();
oo.print(s);
}
}
예제5 결과)
1~100까지 합 :5050
==========================================================================================
예제6)
public class Test6{
//클랙스 메소드. 클래스 로딩시 메모리 할당.
// 그럼 메모리에서 제거는? 프로그램 종료시 제거 -> 아무대나 static 붙이지 않아야 한다.
public static int sum(int n) {
int s=0;
for(int i=1; i<=n; i++)
s+=1;
return s;
}
public static void main(String[] args) {
int ss;
// 일반적으로 클래스메소드는 클래스명.메소드명() 식으로 부름(동일클래스내에서만 '클래스명.'을 생략 할 수 있음.
ss=sum(100); // ss=Test6.sum(100);
System.out.println("합 :" + ss);
}
}
예제6 결과)
합 :100
==========================================================================================
예제7)
public class Test7 {
public static void main(String[] args) {
Rect7 ob=new Rect7();
ob.set(10);
double a=ob.area();
double b=ob.len();
ob.print(a,b);
}
}
/*
원의 넓이와 둘레를 구하는 클래스 만들기
데이터 : 반지름
메소드 : 넓이 구하기, 둘레구하기, 출력하기
한번 만들어보삼
*/
class Rect7 {
private int r;
public void set(int rr){
r=rr;
}
public double area(){
return r*r*3.14f;
}
public double len(){
return r*2*3.14f;
}
public void print(double a, double b){
System.out.println("반지름:"+r);
System.out.println("넓이:"+a);
System.out.println("둘레:"+b);
}
}
예제7 결과)
반지름:10
넓이:314.0
둘레:62.80000305175781
==========================================================================================
예제8)
/*
생성자 : 메모리할당, 초기화
- 생성자는 일반 메소드 처럼 호출될 수 없으며 객체를 생성할 때
클래스 객체 = new 생성자(); 식으로 부름
- 생성자는 클래스와 동일한 이름을 가져야 하며 인자를 가질 수 있다.
- 생성자는 중복정의가 가능하다.
- 생성자는 리턴타입이 존재하지 않는다.
- 생성자를 작성하지 않으면 디폴트 생성자가 컴파일시 만들어진다.
디폴트생성자는 아무런 코드가 없는 빈상태의 생성자이며 생성자가 존재하면 만들지 않는다.
*/
public class Test8 {
public static void main(String[] args){
//객체생성(인스턴스 메모리할당)
Ex1 oo = new Ex1();
oo.set(10);
oo.print();
Ex2 bb=new Ex2();
bb.print();
//Ex3 cc=new Ex3(); // 오류. 인자가 없는 생성자가 없다.
Ex3 cc = new Ex3(50);
cc.print();
Ex4 e1=new Ex4();
e1.print();
Ex4 e2=new Ex4(30);
e2.print();
}
}
/*
생성자가 없으면 컴파일시 다음과 같이 디폴트 생성자가 만들어짐
public Ex1(){}
*/
class Ex1{
private int a;
public void set(int aa) {
a=aa;
}
public void print(){
System.out.println("a:"+a);
}
}
class Ex2{
private int a;
public Ex2(){ // 생성자.클래스명과 동일하고 리턴타입이 없어야함.
a=100; // 초기화
}
public void set(int aa) {
a=aa;
}
public void print(){
System.out.println("a:"+a);
}
}
class Ex3{
private int a;
// 인자가 있는 생성자
public Ex3(int aa){
a=aa;
}
public void set(int aa) {
a=aa;
}
public void print(){
System.out.println("a:"+a);
}
}
class Ex4{
private int a;
// 인자가 없는 생성자
public Ex4(){
}
// 인자가 있는 생성자
public Ex4(int aa){
a=aa;
}
public void set(int aa) {
a=aa;
}
public void print(){
System.out.println("a:"+a);
}
}
예제8 결과)
a:10
a:100
a:50
a:0
a:30
==========================================================================================
예제9)
public class Test9{
public static void main(String[] args){
/*
생성자 호출 순서
1.인스턴스변수메모리 할당
2.초기화블럭실행
3.생성자 몸체 실행
*/
Demo9 ob=new Demo9();
ob.print();
}
}
class Demo9{
private int a; // 초기값 : 0
private int b= 10; // 초기화
private int c;
{ // 초기화 블럭
a=20;
System.out.println("초기화블럭......");
}
// System.out.println("이건 오류........"); //에러
public void print(){
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println("c:"+c);
}
}
예제9 결과)
초기화블럭......
a:20
b:10
c:0
'자바 > 객체지향' 카테고리의 다른 글
static 키워드 (0) | 2013.05.21 |
---|---|
업캐스팅 다운캐스팅 (0) | 2013.05.19 |
재정의(override), 중복정의(overloading) (0) | 2013.05.19 |
자바의 상속 (0) | 2013.05.19 |
Method 메서드 (0) | 2013.05.14 |