자바 6강 - 객체지향과 절차지향의 차이, 접근자, 클래스, 객체

2018. 11. 27. 22:42IT/JAVA

행운상을 뽑기위한 프로그램

import java.util.*;

class Luck

{

public static void main(String[] args)

{

Random r = new Random();

int select=0;

for(int i=0;i<100;i++)

{

select=8;

while(select ==8)

{

select=r.nextInt(10)+1;

}

try

{

Thread.sleep(30);

}

catch (InterruptedException e)

{}

System.out.println(select);

}

System.out.print("행운의 번호는" + select);

}

}

객체지향과 절차지향

절차지향 : 데이터구조와 그 데이터를 변화 시키는 알고리즘(함수)으로 구성(데이터자체가 주인공)

객체지향 : 객체들이 메시지를 통하여 통신함으로써 원하는 결과를 얻는다. 각 객체는 고유의 데이터와 데이터를 처리할 수 있는 메소드로 구성

객체는 데이터와 메소드를 가진다.

성적처리를 한다고 가정해보자.

객체지향프로그래밍에서는 각 학생마다 객체이다. 즉 자신의 성적 데이터와 성적을 출력하는 매소드가 각 객체마다 존재한다.

나 : 너 성적 모니?(김현중 학생 한사람에게 물어봤다.)

현중이 : 나 90점.(현중이 머릿속에 성적점수 데이터를 입이라는 메소드를 통해 나에게 메시지가 전달된다.)

동작보다는 객체, 논리보다는 자료를 바탕으로 구성되며 객체라는 시각에서 접근하는 프로그래밍기법을 말한다.

객체란? 좁은의미에서 클래스의 인스턴스를 의미한다.

클래스란 ? 객체를 만들기 위한 틀 또는 설계도라고 할 수 있다.

객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성 이 있다.

객체의 구성

속성의 값을 나타내는 데이터

데이터를 변경하거나 조작할 수 있는 메서드

시계라는 객체를 만들어보자!!!

1.

시계

데이터 : 시, 분, 초, 월, 일, 년, 요일, 오전후

알람 시,분,초

메소드 : 현재시각을 보여준다, 현재시각을 설정한다, 알람을 설정한다, 알람을 울린다

2.

시계 - class MyClock {

데이터 : int hour, min, sec;

메소드 : void setTime(int h, int m, int s){

hour = h;

min = m;

sec = s;

return;

}

String getTime() {

return hour+"시“+min+"분”+sec+"초“;

}

클래스 정의하기

[접근 제어자] class 클래스 이름

{

멤버변수(필드);

생성자; // 메소드의 한 종류

멤버 메서드

}

생성자

new 연산자를 이용해 객체를 생성할 때 호출된다.

반환형이 없다.(매우 중요!!)

클래스 이름과 메소드 이름이 같다.

String s = new String("동양“);

이것이 생성자 이다.

class ClassExam

{

private String memberVar; // 맴버변수

public ClassExam()

{

System.out.println("객체를 생성할때 가장 먼저 호출되는것이 생성자이다.");

System.out.println("그러므로 초기화 용도로 많이 사용된다.");

System.out.println("여기서는 memberVar 값을 \"맴버변수\" 로 초기화 한다");

memberVar = "맴버변수";

}

public void method() {}

}

class ClassTest

{

public static void main(String args[])

{

ClassExam ce = new ClassExam();

}

}

접근제어자

public, private, protected, 접근제어자 안쓴 것(default) 4가지가 있다.

class A

{

int i;

void method()

{

i=3; // 같은 클래스 내에서 읽던지 쓰던지 하는 것이 access 된다. 지금은 default 접근자로써 접근한 것이다.

}

}

class B

{

void static void main(String a[])

{

A a = new A();

System.out.println(a.i); // 같은 패키지에 있기 때문에 access가 된다.

}

다른 패키지에 있는 클래스 C가 a.i를 access 하기 위해서는 class A가 public 접근자를 써야한다.

만약 private int i; 로 선언되면 자기 클래스 내에서만 사용 가능하다.

* public 과 private는 확실히 알아둬라

맴버 메서드

클래스 내부의 멤버 변수가 무엇이고 어떻게 사용되는지 몰라도 멤버 메서드를 사용하여 원하는 동작이나 결과를 얻을 수 있다.(은닉화, 캡슐화)

맴버변수는 private로 선언하여 은닉화와 캡슐화를 하고, 맴버메소드는 맴버 변수를 이용하여 반환한다.

왜 맴버변수를 private로 접근제어자를 넣느냐면 아래 이유와 같다.

class a { // 시계

int h,m,s;

void setHour(int x){

if(x>=0 && x<=24)

{

h=x;

}else{ System.out.println("입력다시하세요“);}

}

}

class O {

A a = new A();

a.h=1500; // 이런식으로 시계 범위를 벗어나는 값을 임의로 넣을수 있기 때문에 private로 맴버변수를 선언한 것이다.

setHour(1500); // 메소드를 통하여 안전한 데이터를 입력받도록 한다. 이 경우 입력 다시하라고 메시지가 나타난다.

}

패키지

소스관리에 편리하다.

Date 클래스는 특정 시점을 나타내기 위한 클래스.

import java.util.Date;

public class Date0

{

public static void main(String args[]){

System.out.println(new java.util.Date());

// 이미 java.util안에 있는 패키지 임포트했으므로 Date 클래스만 써줘도 된다.

System.out.println(new Date().toString()); // 지금 만든 객체의 toString() 메소드를 실행해라

System.out.println(new Date().getTime()); // 1970년 1월 1일부터 흐른 시간

}

}

import java.util.*;

class DateExam

{

public static void main(String args[])

{

Date date = new Date();

long start = date.getTime(); // 지금 현재의 시간을 start 변수에 기록

try

{

Thread.sleep(1000); // 1000ms를 쉰다음

}

catch (InterruptedException e)

{}

date = new Date(); // 새로운 객체만들어 date에 메모리 주소 기억

long stop = date.getTime(); // 지금 현재의 시간을 stop 변수에 기록

System.out.println(stop-start); // stop - start를 하였더니 얼마나 시간지났는지 알수 있음

}

}

java.util.Date를 이용한 게임

import java.util.*;

import java.io.*;

class DateGame

{

public static void main(String args[])

{

Date date = new Date();

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

long start=0, stop=0;

start = date.getTime();

try

{

br.readLine();

date = new Date();

stop = date.getTime();

}

catch (Exception o)

{}

System.out.println((stop-start));

}

}

이 프로그램을 객체지향적인 프로그래밍으로 바꿔보자.

import java.util.*;

import java.io.*;

class Game

{

public static void main(String args[])

{

DateGame dg = new DateGame();

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

try

{

br.readLine();

System.out.println(dg.stop()+"초");

}

catch (IOException o)

{}

}

}

class DateGame

{

private long start, stop;

public DateGame()

{

start = new Date().getTime();

}

public float stop()

{

stop = new Date().getTime();

return (float)(stop-start)/1000.0f;

}

}

클래스 연습 1

책의 제목과 저자 정보를 저장하고 출력하는 자바프로그램을 만들어보자.

[첫번째방법]

클래스 이름: Book

제목, 저자 필드

메소드는 제목과 저자를 설정하는 메소드(setData),

제목과 저자를 출력하는 메소드(getData)

클래스 이름:Bookshelf

main메소드에서 두개의 Book객체를 생성하고 제목과 저자

를 설정한 후(setData이용), 제목과 저자를 출력(getData이

용)하세요.

class Book

{

private String subject;

private String author;

void setData(String s, String a)

{

subject = s;

author = a;

}

void getData()

{

System.out.println("책제목 : "+ subject);

System.out.println("저자 : " + author);

System.out.println();

}

}

class Bookshelf

{

public static void main(String args[])

{

Book faust = new Book();

Book java = new Book();

faust.setData("파우스트","괴테");

java.setData("자바","김교수");

faust.getData();

java.getData();

}

}

[두번째방법]

첫번째 방법에서 setData 대신에 생성자를 만들어 이용해 보아라.

import java.io.*;

class Book

{

private String subject;

private String author;

Book()

{}

Book(String s, String a)

{

subject = s;

author = a;

}

void setData(String s, String a)

{

subject = s;

author = a;

return;

}

void printData()

{

System.out.println("책제목 : "+ subject);

System.out.println("저자 : " + author);

System.out.println();

return;

}

String getData()

{

return "책제목 : "+ subject +", 저자 :" + author;

}

}

class Bookshelf

{

public static void main(String args[])

{

Book faust = new Book();

Book java = new Book();

Book wlan = new Book("무선랜","김태성"); // 생성자로 데이터 입력한경우

Book linux = new Book("서버구축","이재설");

faust.setData("파우스트","괴테"); // setData() 메소드를 이용해 데이터를 입력한 경우

java.setData("자바","김교수");

faust.printData(); // 반환값이 없는 메소드 호출

java.printData();

System.out.println("===================================");

System.out.println(wlan.getData()); // 반환값이 String값인경우

System.out.println(linux.getData());

}

}

특강

/*

*

* 선택정렬 : 전체중 가장 작은수를 선택

* 그 수와 첫번째 수와 자리 교환(반복)

*

* 한 단계를 수행하고 어떻게 하면 일반적으로 사용할 수 있게 하는가!!!

*

*/

class SelectionSort

{

public static void main(String[] args)

{

int num[] = {3,24,1,55,17,43,5};

System.out.println("정렬전");

for(int i=0;i<num.length;i++)

{

System.out.print(num[i]+" ");

}

System.out.println();

int min=0, temp=0, start=0; // 가장 작은 값의 인덱스

System.out.println("\n정렬후");

for(start=0;start<num.length-1;start++)

{

min=start;

for(int i=start+1;i<num.length;i++)

{

if(num[min] > num[i])

{

min = i;

}

}

temp=num[start];

num[start]=num[min];

num[min]=temp;

for(int i=0;i<num.length;i++) // 첫단계에서 끝단계까지 정렬상태 출력

{

System.out.print(num[i]+" ");

}

System.out.println();

}

}

}