명품 JAVA Programming 제 4 장 클래스와 객체.

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

5 장 조건과 반복 ②. Contents Counting and Looping [while 문 사용 ] Powers of 2 [while 문 사용 ] More Guessing [do 문 사용 ] Election Day [do 문 사용 ] Finding Maximum &
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제3장선택과 반복.
제 7주 2015년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
객체지향 프로그래밍.
Chap05 상속 5.1 상속의 개요 5.2 멤버 변수의 상속 5.3 메소드의 상속과 오버라이딩(Overriding)
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
7장 배열 ②.
어서와 Java는 처음이지! 제4장 배열.
Java Seminar 6.
Java Presentation 중간 시험2 풀이
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
윤 홍 란 제3장 클래스와 객체의 사용-1 윤 홍 란
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
[INA470] Java Programming Youn-Hee Han
명품 JAVA Programming 제 7 장 제네릭과 컬렉션.
명품 JAVA Essential.
명품 JAVA Essential.
정적 메소드와 정적 변수 상수 래퍼 클래스 포매팅
명품 JAVA Programming.
명품 JAVA Essential.
Power Java 제4장 자바 프로그래밍 기초.
[INA470] Java Programming Youn-Hee Han
10장 객체-지향 프로그래밍 II ©창병모.
Power Java 제10장 배열.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
자바 5.0 프로그래밍.
명품 JAVA Essential.
명품 Java Programming.
제 11 장 java.lang 패키지 제 12 장 문자열 제 13 장 유틸리티 제 14 장 입출력 제 15 장 네트워킹
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
윤 홍 란 4 장 클래스 작성 윤 홍 란
5장 조건과 반복 ①.
This, static, final 지정 예약어 자바 4대 중첩 클래스
객체지향적인 프로그래밍에 대한 이해 클래스와 객체의 개념에 대한 이해
C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
주소록 프로그램.
7장 배열 ①.
6장 객체-지향 설계 ①.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
5장 조건과 반복 ②.
6장 객체-지향 설계 ①.
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
Web programming Chap 04 상속 김 정 석
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
[INA470] Java Programming Youn-Hee Han
Java Chapter 4 ~ 주차.
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
JA A V W. 04.
자바 5.0 프로그래밍.
5장 조건과 반복 ①.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
[ 단원 06 ] 상속과 다형성.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
6장 클래스(상속).
Java 5장. 객체지향 개념 public class SumTest {
C# 09장. 클래스와 객체.
Choi Younghwan CSE HUFS
1. 객체-지향 프로그래밍.
Presentation transcript:

명품 JAVA Programming 제 4 장 클래스와 객체

객체지향 언어의 목적 소프트웨어의 생산성 향상 실세계에 대한 쉬운 모델링 컴퓨터 산업 발전에 따라 소프트웨어의 생명 주기(life cycle) 단축 객체 지향 언어는 상속, 다형성, 객체, 캡슐화 등 소프트웨어 재사용 을 위한 여러 장치 내장 소프트웨어의 재사용과 부분 수정을 통해 소프트웨어를 다시 만드는 부담 을 대폭 줄임으로써 소프트웨어의 생산성이 향상 실세계에 대한 쉬운 모델링 과거 수학 계산/통계 처리를 하는 등의 처리 과정, 계산 절차가 중요 현재 컴퓨터가 산업 전반에 활용 실세계에서 발생하는 일을 프로그래밍 실세계에서는 절차나 과정보다 일과 관련된 물체(객체)들의 상호 작용으로 묘사하는 것이 용이 실세계의 일을 보다 쉽게 프로그래밍하기 위한 객체 중심의 객체 지 향 언어 탄생

절차 지향 프로그래밍과 객체 지향 프로그래밍 절차 지향 프로그래밍 객체 지향 프로그래밍 작업 순서를 표현하는 컴퓨터 명령 집합 함수들의 집합으로 프로그램 작성 객체 지향 프로그래밍 프로그램을 실제 세상에 가깝게 모델링 컴퓨터가 수행하는 작업을 객체들간의 상호 작용으로 표현 클래스 혹은 객체들의 집합으로 프로그램 작성 커피 자판기 객체지향적 프로그래밍의 객체들의 상호 관련성 절차지향적 프로그래밍의 실행 절차

객체 지향 언어의 특성 : 캡슐화 캡슐화 메소드(함수)와 데이터를 클래스 내에 선언하고 구현 외부에서는 공개된 메소드의 인터페이스만 접근 가능 외부에서는 비공개 데이터에 직접 접근하거나 메소드의 구현 세부를 알 수 없음 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한 실세계의 캡슐화 자바 객체의 캡슐화

객체 지향의 특성 : 상속 유전적 상속 관계 표현 나무는 식물의 속성과 생물의 속성을 모두 가짐 사람은 생물의 속성은 가지지만 식물의 속성은 가지고 있지 않음

객체 지향 언어에서의 상속 상속 상위 클래스의 특성을 하 위 클래스가 물려받음 서브 클래스 자바는 클래스 다중 상속 없음 상위 클래스 : 수퍼 클래스, 하위 클래스 : 서브 클래스 서브 클래스 수퍼 클래스 코드의 재사용 새로운 특성 추가 가능 자바는 클래스 다중 상속 없음 인터페이스를 통해 다중 상 속과 같은 효과 얻음

객체 지향의 특성 : 다형성 다형성 동일한 이름의 기능이 서로 다르게 작동하는 현상 자바의 다형성 사례 슈퍼 클래스의 메소드를 서브 클래스마다 다르게 구현하는 메소드 오버라이딩 한 클래스 내에 구현된 동일한 이름이지만 다르게 작동하는 여러 메소드

클래스와 객체 클래스 객체 사례 객체의 속성과 행위 선언 객체의 설계도 혹은 틀 클래스의 틀로 찍어낸 실체 메모리 공간을 갖는 구체적인 실체 클래스를 구체화한 객체를 인스턴스(instance)라고 부름 객체와 인스턴스는 같은 뜻으로 사용 사례 클래스: 소나타자동차, 객체: 출고된 실제 소나타 100대 클래스: 벽시계, 객체: 우리집 벽에 걸린 벽시계들 클래스: 책상, 객체: 우리가 사용중인 실제 책상들

치즈붕어빵, 크림붕어빵, 앙코붕어빵 등이 있습니다. 그래도 이들은 모두 붕어빵입니다. 클래스와 객체와의 관계 붕어빵 틀은 클래스이며, 이 틀의 형태로 구워진 붕어빵은 바로 객체입니다. 붕어빵은 틀의 모양대로 만들어지지만 서로 조금씩 다릅니다. 치즈붕어빵, 크림붕어빵, 앙코붕어빵 등이 있습니다. 그래도 이들은 모두 붕어빵입니다.

사람을 사례로 든 클래스와 객체 사례 이름, 직업,나이, 성별, 혈액형 밥 먹기, 잠자기, 말하기, 걷기 클래스: 사람 객체:김미남 이름 김미남 직업 교수 나이 47 성별 남 혈액형 AB 이름 최승희 직업 의사 나이 45 성별 여 혈액형 A 객체 : 최승희 이름 이미녀 직업 골프선수 나이 28 성별 여 혈액형 O 객체 : 이미녀

클래스 구성

클래스 선언 클래스 접근 권한, public class Person 필드(field) 생성자(constructor) 다른 클래스들에서 이 클래스를 사용하거나 접근할 수 있음을 선언 class Person Person이라는 이름의 클래스 선언 클래스는 {로 시작하여 }로 닫으며 이곳에 모든 필드와 메소드 구현 필드(field) 값을 저장할 멤버 변수 멤버 변수 혹은 필드라고 함 필드의 접근 지정자 public 필드를 다른 클래스의 메소드에서 접근할 수 있도록 공개한다는 의미 생성자(constructor) 클래스의 이름과 동일한 메소드 클래스의 객체가 생성될 때만 호출되는 메소드 메소드(method) 메소드는 함수이며 객체의 행위를 구현 메소드의 접근 지정자 public 메소드를 다른 클래스의 메소드에서 호출할 수 있도록 공개한다는 의미

객체 생성 객체 생성 객체 생성 과정 new 키워드를 이용하여 생성 객체에 대한 레퍼런스 변수 선언 public static void main (String args[]) { Person aPerson; // 1. 레퍼런스 변수 aPerson 선언 aPerson = new Person("김미남"); // 2. Person 객체 생성 aPerson.age = 30; // 객체 멤버 접근 int i = aPerson.age; // 30 String s = aPerson.getName(); // 객체 메소드 호출 }

객체 생성 및 사용 예

객체의 활용 객체의 멤버 접근 : 객체 레퍼런스.멤버 public class ClassExample { public static void main (String args[]) { Person aPerson = new Person("홍길동"); aPerson.age = 30; int i = aPerson.age; String s = aPerson.getName(); } 객체의 필드에 값 대입 객체의 필드에서 값 읽기 객체의 메소드 호출

예제 4-1 : 상품 하나를 표현하는 클래스 Goods 만들기 상품 하나를 표현하는 클래스 Goods를 작성하라. 상품은 String 타입의 name, int 타입의 price, numberOfStock, sold 등 네 개의 필드를 갖는다. Goods 클래스 내에 main() 메소드를 작성하여 Goods 객체를 하나 생성하고 이 객체에 대한 레퍼런스 변수 명을 camera로 하라. 그리고 나서 camera의 상품 이름(name 필드)을 “Nikon”, 값(price)을 400000, 재고수(numberOfStock)를 30, 팔린 개수(sold)를 50으로 설정하라. 그리고 설정된 이들 값을 화면에 출력하라. public class Goods { String name; int price; int numberOfStock; int sold; public static void main(String[] args) { Goods camera = new Goods(); camera.name = "Nikon"; camera.price = 400000; camera.numberOfStock = 30; camera.sold = 50; System.out.println("상품 이름:" + camera.name); System.out.println("상품 가격:" + camera.price); System.out.println("재고 수량:" + camera.numberOfStock); System.out.println("팔린 수량:" + camera.sold); } 상품 이름:Nikon 상품 가격:400000 재고 수량:30 팔린 수량:50

예제 4-2 : 지수 클래스 MyExp 만들기 클래스 MyExp를 작성하라. MyExp는 지수값을 표현하는 클래스로서 두 개의 정수형 멤버 필드 base와 exp를 가진다. 23의 경우 base는 2이며, exp는 3이다. base와 exp는 양의 정수만을 가지는 것으로 가정한다. 또한 MyExp는 정수값을 리턴하는 getValue()라는 메소드를 제공한다. getValue()는 base와 exp 값으로부터 지수를 계산하여 정수 값으로 리턴한다. 예를 들어 MyExp객체의 base 필드가 2이고 exp가 3이라면 getValue()는 8을 리턴한다. public class MyExp { int base; int exp; int getValue() { int res=1; for(int i=0; i<exp; i++) res = res * base; return res; } public static void main(String[] args) { MyExp number1 = new MyExp(); number1.base = 2; number1.exp = 3; MyExp number2 = new MyExp(); number2.base = 3; number2.exp = 4; System.out.println("2의 3승 = " + number1.getValue()); System.out.println("3의 4승 = " + number2.getValue()); 2의 3승 = 8 3의 4승 = 81

객체 배열 객체 배열 생성 및 사용

객체 배열 선언과 생성 사례 public static void main(String [] args) { Person[] pa; pa = new Person[10]; for(int i=0;i<pa.length; i++) { pa[i] = new Person(); pa[i].age = 30 + i; } for(int i=0;i<pa.length;i++) System.out.print(pa[i].age+" "); 30 31 32 33 34 35 36 37 38 39

예제 4-3 : 객체 배열 생성 Scanner 클래스를 이용하여 상품을 입력 받아 Goods 객체를 생성하고 이들을 Goods 객체 배열에 저장하라. 상품을 3개 입력 받으면 이들을 모두 화면에 출력하라. import java.util.Scanner; public class GoodsArray { public static void main(String[] args) { Goods [] goodsArray; goodsArray = new Goods [3]; Scanner s = new Scanner(System.in); for(int i=0; i<goodsArray.length; i++) { String name = s.next(); int price = s.nextInt(); int n = s.nextInt(); int sold = s.nextInt(); goodsArray[i] = new Goods(name, price, n, sold); } System.out.print(goodsArray[i].getName()+" "); System.out.print(goodsArray[i].getPrice()+" "); System.out.print(goodsArray[i].getNumberOfStock()+" "); System.out.println(goodsArray[i].getSold()); class Goods { private String name; private int price; private int numberOfStock; private int sold; Goods(String n, int p, int nStack, int s) { name = n; price = p; numberOfStock = nStock; sold = s; } String getName() {return name;} int getPrice() {return price;} int getNumberOfStock() {return numberOfStock;} int getSold() {return sold;} 콜라 500 10 20 사이다 1000 20 30 맥주 2000 30 50 키 입력 부분

메소드 형식 메소드 메소드 구성 형식 메소드는 C/C++의 함수와 동일 자바의 모든 메소드는 반드시 클래스 안에 있어야 함(캡슐화 원칙) 메소드 구성 형식 접근 지정자 public. private, protected, 디폴트(접근 지정자 생략된 경우) 리턴 타입 메소드가 반환하는 값의 데이터 타입

인자 전달 - call by value 자바의 인자 전달 방식 값에 의한 호출(call by value) 기본 타입의 값을 전달하는 경우 값이 복사되어 전달 메소드의 매개 변수가 변경되어도 호출한 실인자 값은 변경되지 않음 객체 혹은 배열을 전달하는 경우 객체나 배열의 레퍼런스만 전달 객체 혹은 배열이 통째로 복사되어 전달되는 것이 아님 메소드의 매개 변수와 호출한 실인자가 객체나 배열을 공유하게 됨

기본 타입의 값이 전달되는 경우 33

객체가 전달되는 경우 * 객체가 복사되어 전달되는 것이 아님 객체에 대한 레퍼런스 만 복사되어 전달 34

배열이 전달되는 경우 매개 변수에 배열의 레퍼런스만 전달 2 3 4 5 6

예제 4-4 : 배열의 전달 char 배열을 메소드의 인자로 전달하여 배열 속의 공백(' ')문자를 ‘,’로 대치하는 프로그램을 작성하라. public class ArrayParameter { static void replaceSpace(char a[]) { for (int i = 0; i < a.length; i++) if (a[i] == ' ') a[i] = ','; } static void printCharArray(char a[]) { System.out.print(a[i]); System.out.println(); public static void main (String args[]) { char c[] = {'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','c','i','l','.'}; printCharArray(c); replaceSpace(c); c main() replaceSpace() a for (int i = 0; i < a.length; i++) if (a[i] == ' ') a[i] = ','; , T h i s a p e n c l . This is a pencil. This,is,a,pencil.

메소드 오버로딩 오버로딩(Overloading) 한 클래스 내에서 두 개 이상의 이름이 같은 메소드 작성 메소드 이름이 동일하여야 함 매개 변수의 개수가 서로 다르거나, 타입이 서로 달라야 함 리턴 타입은 오버로딩과 관련 없음 // 메소드 오버로딩이 성공한 사례 class MethodOverloading { public int getSum(int i, int j) { return i + j; } public int getSum(int i, int j, int k) { return i + j + k; public double getSum(double i, double j) { // 메소드 오버로딩이 실패한 사례 class MethodOverloadingFail { public int getSum(int i, int j) { return i + j; } public double getSum(int i, int j) { return (double)(i + j);

오버로딩된 메소드 호출

this 레퍼런스 this 란? 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스 컴파일러에 의해 자동 선언 : 별도로 선언할 필요 없음 class Samp { int id; public Samp(int x) { id = x; } public void set(int x) { id = x; } public int get() {return id; } } class Samp { int id; public Samp(int x) { this.x = id; } public void set(int x) { this.x = id; } public int get() {return id; } }

this가 필요한 경우 this의 필요성 객체의 멤버 변수와 메소드 변수의 이름이 같은 경우 다른 메소드 호출 시 객체 자신의 레퍼런스를 전달할 때 메소드가 객체 자신의 레퍼런스를 반환할 때 class Samp { int id; public Samp(int id) { this.id = id; } // 매개 변수 이름과 필드의 이름이 같을 때 public void set(int id) { this.id = id; } public int get() {return this.id; } public Samp me() { return this; // 자신의 레퍼런스를 반환할 때 }

this에 대한 이해

객체의 치환 * 객체의 치환은 객체가 복사되는 것이 아니며 레퍼런스가 복사된다. ob1.id=4 ob2.id=4

생성자 개념 생성자 - 객체가 생성될 때 초기화를 위해 실행되는 메 소드

생성자 생성자의 특징 생성자는 메소드 생성자 이름은 클래스 이름과 동일 생성자는 new를 통해 객체를 생성할 때만 호출됨 생성자도 오버로딩하여 여러개 작성 가능 생성자는 리턴 타입을 지정할 수 없음 생성자는 하나 이상 선언되어야 함 개발자가 생성자를 작성하지 않았으면 컴파일러에 의해 자동으로 기 본 생성자가 선언됨 기본 생성자를 디폴트 생성자(default constructor)라고도 함

생성자 정의와 생성자 호출

예제 4-5 : 생성자 정의와 호출 클래스 Book을 String title, String author, int ISBN의 3개의 필드를 갖도록 정의하라. public class Book { String title; String author; int ISBN; public Book(String title, String author, int ISBN) { this.title = title; this.author = author; this.ISBN = ISBN; } public static void main(String [] args) { Book javaBook = new Book("Java JDK", "황기태", 3333);

기본 생성자 기본 생성자(default constructor) 클래스에 생성자가 하나도 선언되지 않은 경우 컴파일러에 의해 자동으로 생성 매개 변수 없는 생성자 아무 작업 없이 단순 리턴 디폴트 생성자라고도 부름 class DefaultConstructor{ int x; public void setX(int x) {this.x = x;} public int getX() {return x;} public static void main(String [] args) { DefaultConstructor p = new DefaultConstructor(); p.setX(3); } class DefaultConstructor{ int x; public void setX(int x) {this.x = x;} public int getX() {return x;} public DefaultConstructor() { } public static void main(String [] args) { DefaultConstructor p= new DefaultConstructor(); p.setX(3); } 컴파일러에 의해 자동 삽입된 기본 생성자 개발자가 작성한 코드 컴파일러가 자동으로 기본 생성자를 삽입한 코드

기본 생성자가 자동 생성되지 않는 경우 클래스에 생성자가 하나라도 존재하면 기본 생성자가 자동 삽입되지 않음 클래스에 생성자가 하나라도 존재하면 기본 생성자가 자동 삽입되지 않음 컴파일러가 기본 생성자를 자동 생성하지 않음 class DefaultConstructor{ int x; public void setX(int x) {this.x = x;} public int getX() {return x;} public DefaultConstructor(int x) { this.x = x; } public static void main(String [] args) { DefaultConstructor p1= new DefaultConstructor(3); int n = p1.getX(); DefaultConstructor p2= new DefaultConstructor(); p2.setX(5); public DefaultConstructor() { } 컴파일 오류. 해당하는 생성자가 없음 !!!

this(), 생성자에서 다른 생성자 호출 this() 같은 클래스의 다 른 생성자 호출 생성자 내에서만 사용 가능 생성자 내에서만 사용 가능 다른 메소드에서 는 사용 불가 반드시 생성자 코 드의 제일 처음에 수행 public class Book { String title; String author; int ISBN; public Book(String title, String author, int ISBN) { this.title = title; this.author = author; this.ISBN = ISBN; } public Book(String title, int ISBN) { this(title, "Anonymous", ISBN); public Book() { this(null, null, 0); System.out.println("생성자가 호출되었음"); public static void main(String [] args) { Book javaBook = new Book("Java JDK", "황기태", 3333); Book holyBible = new Book("Holy Bible", 1); Book emptyBook = new Book(); title = "Holy Bible" author = "Anonymous" ISBN = 1 title = "Holy Bible" ISBN = 1

this() 사용 실패 예 public Book() { System.out.println("생성자가 호출되었음"); this(null, null, 0); // 생성자의 첫 번째 문장이 아니기 때문에 컴파일 오류 }

객체의 소멸과 가비지 객체 소멸 자바 응용프로그램에서 임의로 객체 소멸할 수 없음 가비지 new에 의해 생성된 객체 메모리를 자바 가상 기계로 되돌려 주는 행위 소멸된 객체 공간은 가용 메모리에 포함 자바 응용프로그램에서 임의로 객체 소멸할 수 없음 객체 소멸은 자바 가상 기계의 고유한 역할 자바 개발자에게는 매우 다행스러운 기능 C/C++에서는 할당 받은 객체를 개발자가 프로그램 내에서 삭제해야 함 C/C++의 프로그램 작성을 어렵게 만드는 요인 가비지 가비지 : 가리키는 레퍼런스가 하나도 없는 객체 더 이상 접근하여 사용할 수 없게 되었음 가비지 켈렉션 자바 가상 기계의 가비지 컬렉터가 자동으로 가비지를 수집하여 반환

가비지 사례

예제 4-6 : 가비지 발생 다음 소스에서 언제 가비지가 발생하는지 설명하라. public class GarbageEx { public static void main(String[] args) { String a = new String("Good"); String b = new String("Bad"); String c = new String("Normal"); String d, e; a = null; d = c; c = null; }

가비지 컬렉션 가비지 컬렉션 개발자에 의한 강제 가비지 컬렉션 자바에서 가비지 자동 회수 가용 메모리 공간으로 확보 가비지 컬렉터(garbage collector)에 의해 자동 수행 개발자에 의한 강제 가비지 컬렉션 System 또는 Runtime 객체의 gc() 메소드 호출 이 코드는 자바 가상 기계에 강력한 가비지 컬렉션 요청 그러나 자바 가상 기계가 가비지 컬렉션 시점을 전적으로 판단 System.gc(); // 가비지 컬렉션 작동 요청

접근 지정자 이해

클래스 접근 지정자 클래스 앞에 올 수 있는 접근 지정자 public 접근 지정자 다른 모든 클래스가 접근 가능 접근 지정자 생략 (default 접근 지정자) package-private라고도 함 같은 패키지 내에 있는 클래스에서만 접근 가능 같은 디렉토리에 있는 클래스끼리 접근 가능 public class Person {} class Person {}

멤버 접근 지정자 디폴트(default) 멤버 public 멤버 private 멤버 protected 멤버 같은 패키지 내의 다른 클래스만 접근 가능 public 멤버 패키지에 관계 없이 모든 클래스에서 접근 가능 private 멤버 클래스 내에서만 접근 가능 상속 받은 하위 클래스에서도 접근 불가 protected 멤버 같은 패키지 내의 다른 모든 클래스에서 접근 가능 상속 받은 하위 클래스는 다른 패키지에 있어도 접근 가능

멤버 접근 지정자의 이해 public 접근 지정 사례 private 접근 지정 사례

디폴트 접근 지정 사례 protected 접근 지정 사례

예제 4-7 : 접근 지정자의 사용 다음의 소스를 컴파일 해보고 오류가 난 이유를 설명하고 오류를 수정하시오. class Sample { public int a; private int b; int c; } public class AccessEx { public static void main(String[] args) { Sample aClass = new Sample(); aClass.a = 10; aClass.b = 10; aClass.c = 10; Sample 클래스의 a와 c는 각각 public, default 지정자로 선언이 되었으므로, 같 은 패키지에 속한 AccessEx 클래스에서 접근 가능 b는 private으로 선언이 되었으므로 AccessEx 클래스에서 접근 불가능

예제 4-7 결과 오류가 수정된 소스 class Sample { public int a; private int b; int c; public int getB() { return b; } public void setB(int value) { b = value; public class AccessEx { public static void main(String[] args) { Sample aClass = new Sample(); aClass.a = 10; aClass.setB(10); aClass.c = 10; private 접근 지정자를 갖는 멤 버 b를 위해 클래스 내부에 getB()/setB() 메소드 만들어 접근

static 이해를 위한 그림 눈은 각 사람마다 있고 공기는 모든 사람이 소유(공유)한다 사람은 모두 각각 눈을 가지고 태어난다. 세상에는 이미 공기가 있으며 태어난 사람은 모두 공기를 공유한다. 그리고 공기 역시 각 사람의 것이다.

static 멤버와 non-static 멤버 공간적 - 멤버들은 객체마다 독립적으로 별도 존재 인스턴스 멤버라고도 부름 시간적 - 필드와 메소드는 객체 생성 후 비로소 사용 가능 비공유의 특성 - 멤버들은 여러 객체에 의해 공유되지 않고 배타적 static 멤버란? 객체를 생성하지 않고 사용가능 객체마다 생기는 것이 아님 클래스당 하나만 생성됨 클래스 멤버라고도 부름 특성 공간적 특성 - static 멤버들은 클래스 당 하나만 생성. 시간적 특성 - static 멤버들은 클래스가 로딩될 때 공간 할당. 공유의 특성 - static 멤버들은 동일한 클래스의 모든 객체에 의해 공유 class StaticSample { int n; // non-static 필드 void g() {...} // non-static 메소드 static int m; // static 필드 static void f() {...} // static 메소드 }

non-static 멤버와 static 멤버의 차이

static 멤버를 객체의 멤버로 접근하는 사례

static 멤버를 클래스 이름으로 접근하는 사례

static의 활용 전역 변수와 전역 함수를 만들 때 활용 static 멤버를 가진 클래스 사례 자바의 캡슐화 원칙 지킴 다른 클래스에서 공유하는 전역 변수나 전역 함수도 반드시 클래스 내부에 구현해야 함 static 멤버를 가진 클래스 사례 java.lang.Math 클래스 JDK와 함께 배포되는 java.lang.Math 클래스 모든 필드와 메소드가 public static으로 선언 다른 모든 클래스에서 사용할 수 있음 public class Math { public static int abs(int a); public static double cos(double a); public static int max(int a, int b); public static double random(); ... } // 잘못된 사용법 Math m = new Math(); // Math() 생성자는 private int n = m.abs(-5); // 바른 사용법 int n = Math.abs(-5);

static 메소드의 제약 조건 1 static 메소드는 오직 static 멤버만 접근 가능 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때 문에, non-static 메소드와 필드 사용 불가 non-static 메소드는 static 멤버 사용 가능

static 메소드의 제약 조건 2 static 메소드는 this 사용불가

예제 4-8 : static을 이용한 달러와 우리나라 원화 사이의 변환 예제 class CurrencyConverter { private static double rate; // 한국 원화에 대한 환율 public static double toDollar(double won) { return won/rate; // 한국 원화를 달러로 변환 } public static double toKWR(double dollar) { return dollar * rate; // 달러를 한국 원화로 변환 public static void setRate(double r) { rate = r; // 환율 설정. KWR/$1 public class StaticMember { public static void main(String[] args) { CurrencyConverter.setRate(1121); // 미국 달러 환율 설정 System.out.println("백만원은 " + CurrencyConverter.toDollar(1000000) + "달러입니다."); System.out.println("백달러는 " + CurrencyConverter.toKWR(100) +"원입니다."); 백만원은 892.0606601248885달러입니다. 백달러는 112100.0원입니다.

final 클래스와 메소드 final 클래스 - 더 이상 클래스 상속 불가능 final 메소드 - 더 이상 오버라이딩 불가능 final class FinalClass { ..... } class DerivedClass extends FinalClass { // 컴파일 오류 public class SuperClass { protected final int finalMethod() { ... } } class DerivedClass extends SuperClass { protected int finalMethod() { ... } // 컴파일 오류, 오버라이딩 할 수 없음

final 필드 final 필드, 상수 선언 상수를 선언할 때 사용 상수 필드는 선언 시에 초기 값을 지정하여야 한다 상수 필드는 실행 중에 값을 변경할 수 없다 class SharedClass { public static final double PI = 3.141592653589793; } public class FinalFieldClass { final int ROWS = 10; // 상수 정의, 이때 초기 값(10)을 반드시 설정 void f() { int [] intArray = new int [ROWS]; // 상수 활용 ROWS = 30; // 컴파일 오류 발생, final 필드 값을 변경할 수 없다. }