자바를 공부해 보자

[중첩 클래스 및 상속, 다형성, 추상화, 인터페이스 ] 클래스 기초 1

자바

1. 클래스 기초 1

클래스란?

-> 학교에 최동수, 김순호등 많은 학생들이 있음

- 이때, 공통으로 묶을 수 있는 것은 학생이고, 이것을 클래스라고 함

 

 

-> 한마디로 일반화된 속성과 메소드로 객체를 기술한 것을 클래스라고 함

 

 

 

2) 클래스의 기본 구성

 

형식)

[접근제한자]    [ 지정예약어 ]    CLASS (예약어)    CLASS이름(사용자 명칭)

extends클래스        implements인터페이스 {            //상속관계도

멤버필드     멤버메소드     생성자        중첩클래스}                                        //4가지가 올 수 있음

 

 

* 클래스 밖에 쓰일 수 있는 것은 package, import,(한 글자 입력 받을 때, throws IOException) 또 다른 클래스

 

 

 

 

 

접근제한자 , 지정예약어 생략가능

import

클래스 안에 필드 : 멤버 필드

 

car : 맴버 메소드

 

 

 

 

 

 

 

 

 

2) 클래스의 기본 구성 (4가지)

 

포함 멤버

 

[1] Field

데이터 저장 공간 (멤버변수 - 클래스 안에 있는 멤버)

참고) 메소드 안에서 선언한 변수는 지역 변수라고

 

[2] Method

특정 행위의 기술 영역(멤버메소드)

 

 

[3] Construct

객체 생성 및 초기화를 시켜주는 생성자 메소드

 

[4] Nested Class

중첩클래스

 

 

 

3) 객체(Objext)

 

객체란?(쓸 수 있는 상태)

-> 정수, 실수 또는 문자 등과 같이 단순한 데이터나 자동차, 비행기 등과 같은 복잡한 사물뿐만 아니라

기업에의 공헌도, 이성간의 사랑 등의 추상적 개념에 이르기까지,

인간이 하나의 개념으로 파악하는 모든 것들을 일컫는 것으로 일반적으로 인간에게 인지되는 개념적인 한 단위를 의미함

 

 

 

 

 

 

-1) 객체는 항상 클래스로부터 생성됨

즉, 클래스는 객체를 생성하는 형판 (template)

 

 

-2) 클래스는 두 개의 구성요소 (member)인 자료구조(필드)와 연산 (메소드)을 가짐

 

-3) 클래스로부터 생성된 객체를 instance(인스턴스)라 함

즉, 객체 =instance

 

 

 

-4) 정보처리의 주체는 클래스가 아니라 객체

 

 

-5) 객체지향 프로그래밍의 시작은 클래스의 생성

 

 

3) 객체(Object)

 

프로그래밍에서의 객체란?

사애와 행위의 집합체이다.. 즉 속성(필드, 데이터)와 메소드(함수, 행위)의 집합체임

 

속성(필드)

객체의 정적 특성으로 객체가 가지고 있는 정보를 보관하는 기억장소로 사용되는 데이터 영역

 

 

 

 

메소드 (기능)

객체의 동적 특성으로서 객체의 데이터를 엑세스하거나 또는 객체가 가지고 있는 속성을 변경하는 일을

 

int a[] ;                                 a=new int[5];                                int a [] = new int[5];

 

 

 

 

4) 클래스와 객체

 

객체지향 프로그램은 3단계로 진행됨

-> 자동차 객체를 예를 들어 설명하면 추상화 작업은 프로그램에 적합하게 자동차 객체를 설계 하는 것임

 

 

 

 

 

new 연산자가 힙 영역에 메모리 할당 할당 후

되돌려 주는 주소는 참조 변수에 저장됨

 

 

car01 참조 변수                         시제자료->힙                Car ( ); - > 생성자

 

 

 

 

 

 

 

 

참조 변수와 객체 -> 힙에 저장

 

 

 

 

 

 

닷(.) 멤버 참조 연산자로 필드에 접근

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5) 클래스 사용법

 

 

 

객체 생성

 

 

사람으로썬 같으나 속성은 다 다르다.

 

 

 

 

 

 

 

6) 생성자

 

 

 

생성자 정의

 

생성자 : 클래스로부터 객체가 생성될 때 초기화 과정을 기술하는 특수한 메소드

 

-클래스명과 동일한 메소드

-결과형 리턴값이 없음

-객체 생성 시 반드시 하나의 생성자 호출

-생성자를 없으면 자동으로 default생성자가 생김 ->JVM(자바 가상 기계) 이 만든다

-생성자 오버로딩 할 수 있음

-멤버 필드 값 초기화를 위해 만든 메소드

-객체를 생성할 때만 사용이 가능

 

 

 

 

 

 

 

 

 

 

객체 생성하기

 

class Person{

String name;

int age;

}

public class Exam_01{

public static void main(String [] args){

Person p1 = new Person();

p1.name="태연";

p1.age=25;

}

}

 

 

 

 

 

 

 

 

 

 

 

생상자의 오버로딩

 

 

 

 

 

 

 

7) this, this메소드

 

* 객체를 선언한 후, 객체 자신을 의미

*this 뒤에 참조연산자(.)를 붙여 멤버 접근 가능

*this(매개변수)를 하면 객체가 가지고 있는 생성자 호출

*this() 사용시 반드시 생성자의 첫 번째 줄에 써야 함

 

 

 

 

 

 

 

 

 

8) 객체의 사용

 

객체참조변수는 해당 객체의 멤버변수와 메소드를 사용할 수 있음

 

사용법

객체참조변수.메소드이름();

객체참조변수.멤버변수이름;

 

 

 

 

 

 

9) 객체로 변환하기

 

기존에 만들었던 방 관리 프로그램을 클래스로 변환하여 만들어보자

 

package ch06;

import java.io.IOException;
import java.util.Scanner;

class Room{
 boolean room[];
 Scanner sc;
 int roomsu;
 Room(){
  sc = new Scanner(System.in);
  System.out.print("방의 갯수를 입력:");
  roomsu = sc.nextInt();
  room = new boolean[roomsu];
 }
 
 Room(int roomsu){
  room = new boolean[roomsu];
  //배열은 맨처음 선언해주면 boolean의 초기값은 false로 만들어진다.
  sc = new Scanner(System.in);
  this.roomsu = roomsu;
 }
 public void input() {
  int roomNumber;
  do {
  System.out.print("입실하실 방의 번호:");
  roomNumber = sc.nextInt();
  }while(roomNumber<1 || roomNumber>roomsu);
  //if (roomNumber<1 || roomNumber>roomsu) input();
  
  if(room[roomNumber-1]) {
   System.out.println(roomNumber+"호실은 사용중입니다");
  }else {
   System.out.println(roomNumber+"호실에 입실하셨습니다");
   room[roomNumber-1] = true;
   
  }
 }
 public void output() {
  int roomNumber;
  do {
  System.out.print("퇴실하실 방의 번호:");
  roomNumber = sc.nextInt();
  }while(roomNumber<1 || roomNumber>roomsu);
  //if (roomNumber<1 || roomNumber>roomsu) input();
  
  if(!room[roomNumber-1]) {
   System.out.println(roomNumber+"호실은 빈 방입니다");
  }else {
   System.out.println(roomNumber+"호실에 퇴실하셨습니다");
   room[roomNumber-1] = false;
   
  }
 }
 public void view() {
  for(int i =0 ; i<roomsu; ++i) {
   if(room[i]) {
    System.out.println(i+1+"호실은 사용중입니다");
   }else {
    System.out.println(i+1+"호실은 빈방입니다");
   }
  }
 }
 
  
 public void exit() {
  System.out.print("프로그램을 종료합니다");
  System.exit(0); //프로그램을 영구히 종료합니다.
 }
}
public class Exam_01 {
 public static void main(String[] args) throws IOException {
  Scanner sc = new Scanner(System.in);
  Room room = new Room();
  while(true) {
   System.out.print("1.입실 2.퇴실 3.방보기 4.종료:");
   int select = System.in.read()-48; // 1,\r, \n //0에 대한 아스키코드값 48
   sc.nextLine(); //엔터키가 들어올때까지 입력을 받겠다.
   switch(select) {
   case 1:
    room.input(); break;
   case 2:
    room.output(); break;
   case 3:
    room.view(); break;
   case 4:
    room.exit(); break;
   default :
    System.out.println("잘못 입력하셨습니다");
    
   }
   
  }
 }

}

 

 

 

 

10) 클래스 배열

 

클래스 배열 만들기

 


 

 

클래스를 배열로 만들 때는 먼저 배열을 만들어 준 후, 각각의 배열마다 객체를 선언해 줘야 함

 

 

11) 클래스 배열 문제 풀이

 

성적관리 프로그램을 클래스로 바꾸어 만들어 보자

 

 

package ch06;

import java.util.Scanner;

class SungJuk{
 String name;
 int kor,eng,mat;
 int tot,rank;
 
 public void sumTot() {
  tot = kor+ eng+mat;
 }
 public void disp() {
  System.out.print(name+"\t");
  System.out.print(kor+"\t");
  System.out.print(eng+"\t");
  System.out.print(mat+"\t");
  System.out.print(tot+"\t");
  System.out.print(rank+"\t");
  
 }
}
public class Exam_02 {
 public static void main(String[]args) {
  System.out.print("인원수를 입력:");
  Scanner sc = new Scanner(System.in);
  int inwon = sc.nextInt();
  
  SungJuk sj[] = new SungJuk[inwon];
  
  for (int i=0 ; i<inwon ; i++) {
   sj[i] = new SungJuk();
   System.out.print("이름을 입력:");
   sj[i].name = sc.next();
   System.out.print("국어점수를 입력:");
   sj[i].kor = sc.nextInt();
   System.out.print("영어점수를 입력:");
   sj[i].eng = sc.nextInt();
   System.out.print("수학점수를 입력:");
   sj[i].mat = sc.nextInt();
   sj[i].sumTot();
   sj[i].rank=1;
   
   
   
  }
  for(int i =0 ; i<inwon ; i++) {
   for (int j=0 ; j<inwon ; j++) {
    if (sj[i].tot <sj[j].tot)sj[i].rank++;
   }
  }
  
  System.out.print("이름\t국어\t영어\t수학\t총점\t순위\n");
  for(int i=0 ; i<inwon ; i++) {
   sj[i].disp();
  }
 }
 
}