인스턴스 변수와 메소드의 상호 관계에 대해 알아봅니다. 매개변수와 리턴값에 대해 알아봅니다. 객체의 동치에 대해 알아봅니다.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
원시 변수와 레퍼런스 변수에 대해 알아봅니다. 변수가 저장되는 힙에 대해 알아봅니다. 배열에 대해 알아봅니다.
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
제 9 장 구조체와 공용체.
정적 메소드와 정적 변수 상수 래퍼 클래스 포매팅
7장 배열 ②.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
스택과 힙 지역변수와 인스턴스 변수 객체 생성과 생성자 객체 제거 (가비지 컬렉션)
Lesson 5. 레퍼런스 데이터형.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
4.1 자바 응용 프로그램 분석 4.2 식별자(identifier)와 예약어 4.3 변수와 자료형
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
10장 함수.
Lesson 6. 형변환.
5장. 참조 타입.
제 3장. C보다 나은 C++ II.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
자바 5.0 프로그래밍.
객체지향적인 프로그래밍에 대한 이해 클래스와 객체의 개념에 대한 이해
3장 자바의 기본문법(2).
Java 6장. 클래스 : 속성 public class SumTest {
Lesson 7. 클래스와 메소드 - 1.
10장. 예외처리.
자바 5.0 프로그래밍.
C#.
6장 클래스 6.1 클래스의 일반 구조 6.2 클래스 선언 6.3 객체의 생성 6.4 멤버 변수 6.5 멤버변수 접근 한정자
13. 연산자 오버로딩.
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
7장 인터페이스와 추상 클래스.
Method & library.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
Lesson 4. 수식과 연산자.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Effective Java [Issue 1 and 2]
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
자바 가상 머신 프로그래밍 Chap 10. 자바 컴파일링의 안쪽 ② Pslab 오민경.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 08. 함수.
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
JA A V W. 06.
12. 상속 : 고급.
[ 단원 04 ] 반복과 배열.
제 6 장 함수(functions).
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
안드로이드 앱 개발과정 Step1. 기초과정 강사 : 정 훈 희.
함수, 모듈.
Summary of Pointers and Arrays
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
어서와 C언어는 처음이지 제21장.
7 생성자 함수.
3장 자바의 기본문법(2).
Presentation transcript:

인스턴스 변수와 메소드의 상호 관계에 대해 알아봅니다. 매개변수와 리턴값에 대해 알아봅니다. 객체의 동치에 대해 알아봅니다. 4장. 객체의 행동 인스턴스 변수와 메소드의 상호 관계에 대해 알아봅니다. 매개변수와 리턴값에 대해 알아봅니다. 객체의 동치에 대해 알아봅니다.

객체의 행동 이렇게 하면 상태가 확 바뀌겠죠? 상태 – 인스턴스 변수 행동 – 메소드

객체의 상태와 행동 아는 것 인스턴스 변수 (상태) 메소드 (행동) 하는 것 Song title artist setTitle() setArtist() play() 인스턴스 변수 (상태) 아는 것 메소드 (행동) 하는 것 Q: 모든 객체의 인스턴스 변수(상태)는 달라질 수 있습니다. 그런데 메소드(행동)도 달라질 수 있을까요? A: 메소드 자체는 똑같지만 그 메소드의 실행 결과는 달라질 수 있습니다.

객체의 상태와 행동 s3.play(); t2.play(); Politik Coldplay Darkstar void play() { soundPlayer.playSound(title); } Politik Coldplay Darkstar Grateful Dead My Way Sinatra Song t2 = new Song(); t2.setArtist(“Travis”); t2.setTitle(“Sing”); Song s3 = new Song(); s3.setArtist(“Sex Pistols”); s3.setTitle(“My Way”); Sing Travis My Way Sex Pistols s3 t2 t2.play(); s3.play(); Song Song

객체의 상태와 행동 코드를 직접 실행시켜봅시다. Dog size name bark() Bark Different. class Dog { int size; String name; void bark() { if (size > 60) { System.out.println("Woof! Woof!"); } else if (size > 14) { System.out.println("Ruff! Ruff!"); } else { System.out.println("Yip! Yip!"); } Dog size name bark() Bark Different. class DogTestDrive { public static void main(String[] args) { Dog one = new Dog(); one.size = 70; Dog two = new Dog(); two.size = 8; Dog three = new Dog(); three.size = 35; one.bark(); two.bark(); three.bark(); } 코드를 직접 실행시켜봅시다.

매개변수/인자 자바에서도 메소드에 어떤 값을 전달할 수 있습니다. 매개변수 인자 메소드에서 사용하는 것 인자 호출하는 쪽에서 전달하는 것 메소드에서 받은 매개변수는 그 메소드에서 선언한 지역 변수와 똑같이 간주됩니다. 메소드에 매개변수가 있으면 반드시 해당 유형의 값을 전달해야만 합니다.

매개변수/인자 1. bark 메소드 호출 (인자로 3을 전달) 2. 3이라는 값을 나타내는 비트들이 bark 메소드로 전달됨 Dog d = new Dog(); d.bark(3); 인자 3. 그 비트들이 numOfBarks 매개변수에 들어감 매개변수 void bark(int numOfBarks) { while (numOfBarks > 0) { System.out.println(“ruff”); numOfBarks = numOfBarks – 1; } 4. numOfBarks 매개변수를 메소드 코드 내에서 변수로 사용

리턴값 메소드로부터 값을 받을 수도 있습니다. 리턴 유형은 메소드를 선언할 때 지정하며, 리턴 유형이 정해져 있으면 반드시 그 유형의 값을 리턴해야만 합니다. int giveSecret() { return 42; } void go() { }

리턴값 int theSecret = life.giveSecret(); int giveSecret() { return 42; }

두 개 이상의 매개변수 메소드에 두 개 이상의 인자를 전달할 수도 있습니다. 각 인자는 쉼표로 구분합니다. 메소드에 매개변수가 있을 때 반드시 인자를 전달해야 한다는 원칙은 여전히 적용됩니다.

두 개 이상의 매개변수 void go() { int foo = 7; int bar = 3; void go() { t.takeTwo(foo, bar); } void go() { TestStuff t = new TestStuff(); t.takeTwo(12, 34); } void takeTwo(int x, int y) { int z = x + y; System.out.println(“Total is ” + z); }

값으로 전달 (pass by value) 자바에서는 값으로 전달하는 방식을 사용합니다.

x 값으로 전달 (pass by value) 00000111 void go(int z) { } z int x = 7; x 00000000 00000111 00000111 00000111 z x foo.go(x); x z int int int int void go(int z) { } void go(int z) { z = 0; }

바보 같은 질문은 없습니다. 전달하려고 하는 인자가 원시변수가 아니고 객체인 경우에는 어떻게 되나요? 객체 레퍼런스를 인자로 전달하는 경우에도 여전히 값으로만 전달됩니다. 중요한 것은 여기에서 “값”이라는 것이 “객체”가 아니라, 객체를 참조하는 레퍼런스라는 점입니다. 따라서 그 레퍼런스의 복사본이 전달됩니다.

바보 같은 질문은 없습니다. 메소드에서 리턴 값을 여러 개 선언할 수 있나요? 값을 두 개 이상 리턴하는 방법이 있나요? 리턴값은 한 가지밖에 선언할 수 없습니다. 하지만 세 개의 int를 리턴하고 싶다면 리턴 유형을 int 배열로 선언하면 됩니다. 여러 유형의 값을 리턴하는 방법은 조금 더 복잡한데, 나중에 배우게 될 ArrayList라는 것을 사용하면 됩니다.

바보 같은 질문은 없습니다. 정확하게 처음에 선언한 유형으로만 리턴해야 하나요? 자동으로 해당 유형으로 변환되는 것은 그냥 리턴해도 됩니다. 예: int를 리턴하겠다고 선언한 경우에 byte를 리턴해도 됩니다. 하지만 그렇지 않은 경우에는 강제로 캐스팅을 해야 합니다. 예: return (int) (Math.random() * 10.0);

바보 같은 질문은 없습니다. 메소드에서 리턴한 값으로 반드시 뭔가를 해야 하나요? 그냥 무시하면 안 되나요? 자바에서는 리턴값의 사용 여부에는 전혀 신경을 쓰지 않습니다. 따라서 리턴값을 꼭 어떤 변수에 대입한다거나 특정한 용도로 사용하지 않아도 됩니다. 예를 들어 리턴값은 별로 필요 없고 메소드로 어떤 작업을 하기만 되는 경우에는 리턴값은 그냥 무시하고 메소드를 호출하기만 해도 됩니다.

핵심 정리 클래스에서는 객체가 하는 것과 객체가 아는 것을 정의합니다. 인스턴스 변수(상태)는 객체가 아는 것입니다. 메소드(행동)는 객체가 하는 것입니다. 메소드에서 인스턴스 변수를 이용하여 같은 형식의 객체가 다른 식으로 행동하도록 할 수 있습니다. 메소드에서 매개변수를 사용할 수 있습니다. 즉 메소드에 한 개 이상의 값을 전달할 수 있습니다.

핵심 정리 전달하는 값의 개수와 유형은 반드시 메소드를 선언할 때 지정한 것과 같아야 하며 그 순서도 같아야 합니다. 메소드 안팎으로 전달되는 값은 상황에 따라 자동으로 더 큰 유형으로 올라갈 수 있습니다. 더 작은 유형으로 바꿀 때는 강제로 캐스팅을 해야 합니다. 메소드에 인자를 전달할 때는 리터럴 값(2, ‘c’ 등)을 사용할 수도 있고 선언된 매개변수 유형의 변수(예를 들어 int 변수 x)를 사용할 수도 있습니다.

핵심 정리 메소드를 선언할 때는 반드시 리턴 유형을 지정해야 합니다. 리턴 유형을 void로 지정하면 아무 것도 리턴하지 않아도 됩니다. 메소드를 선언할 때 void가 아닌 리턴 유형을 지정했을 때는 반드시 선언된 리턴 유형과 호환 가능한 값을 리턴해야 합니다.

게터(getter)와 세터(setter) 인스턴스 변수의 값을 알아내기 위한 메소드 일반적으로 인스턴스 변수의 값을 리턴함 getBrand(), getNumOfPickups()… 세터(setter) 인스턴스 변수의 값을 설정하기 위한 메소드 전달된 값을 확인하고 인스턴스 변수의 값을 설정함 setBrand(), setNumOfPickups()…

게터와 세터 class ElectricGuitar { String brand; int numOfPickups; boolean rockStarUsesIt; String getBrand() { return brand; } void setBrand(String aBrand) { brand = aBrand; int getNumOfPickups() { return numOfPickups; } void setNumOfPickups(int num) { numOfPickups = num; boolean getRockStarUsesIt() { return rockStarUsesIt; void setRockStarUsesIt(boolean yesOrNo) { rockStarUsesIt = yseOrNo;

이렇게 theCat이라는 객체의 height 변수의 값을 마음대로 0으로 바꿀 수 있으면 안 됩니다. 캡슐화(encapsulation) 데이터 노출!!! 지금까지 우리가 만든 프로그램에는 데이터가 완전히 노출되어있다는 심각한 문제가 있었습니다. 즉 아무나 인스턴스 변수를 마음대로 보고 건드릴 수 있었습니다. theCat.height = 27; theCat.height = 0; 이렇게 theCat이라는 객체의 height 변수의 값을 마음대로 0으로 바꿀 수 있으면 안 됩니다.

세터 메소드를 사용하면 이렇게 인스턴스 변수의 값이 합당한지 검사할 수도 있습니다. 캡슐화 이런 문제를 어떻게 해결할 수 있을까요? 세터 메소드를 쓰면 됩니다. theCat.height = 0; public void setHeight(int ht) { if (height > 9) { height = ht; } 세터 메소드를 사용하면 이렇게 인스턴스 변수의 값이 합당한지 검사할 수도 있습니다.

캡슐화 그렇다면 데이터를 직접 건드릴 수 없도록 하려면 어떻게 해야 할까요? 액세스 변경자(access modifier) 인스턴스 변수: private으로 선언 게터 및 세터 메소드: public으로 선언

캡슐화 실습 112 페이지에 있는 예제를 직접 실행시켜봅시다. GoodDog size getSize() setSize() Bark() class GoodDog { private int size; public int getSize() { return size; } public void setSize(int s) { size = s; void bark() { …… 112 페이지에 있는 예제를 직접 실행시켜봅시다.

배열 안에 있는 객체 1. Dog 배열 변수 선언 Dog 배열 객체 (Dog[]) Dog[] pets; pets = new Dog[7]; Dog 배열 객체 (Dog[]) pets Dog[]

배열 안에 있는 객체 2. 두 개의 새로운 Dog 객체를 만들고 두 개의 배열 원소 대입 pets[0] = new Dog(); pets[1] = new Dog(); 3. Dog 객체 두 개에 대해 메소드 호출 pets[0].setSize(30); int x = pets[0].getSize(); pets[1].setSize(8); Dog 배열 객체 (Dog[]) pets Dog[]

인스턴스 변수 초기화 인스턴스 변수 선언 인스턴스 변수 선언 및 초기화 int size; String name; String name = “Donny”;

인스턴스 변수의 기본값 114 페이지에 있는 예제를 직접 실행시켜봅시다. class PoorDog { private int size; private String name; public int getSize() { return size; } public String getName() { return name; public class PoorDogTestDrive { public static void main(String[] args) { PoorDog one = new PoorDog(); System.out.println(“Dog size is “ + one.getSize()); System.out.println(“Dog name is “ + one.getName()); } 114 페이지에 있는 예제를 직접 실행시켜봅시다.

인스턴스 변수의 기본값 인스턴스 변수에는 항상 기본값이 들어갑니다. 각 유형별 기본값 정수 0 부동소수점 수 0.0 정수 0 부동소수점 수 0.0 부울 false 레퍼런스 null

인스턴스 변수와 지역 변수 선언되는 위치 초기화 인스턴스 변수 – 클래스 내에서 지역 변수 – 메소드 내에서 인스턴스 변수 – 기본 초기값이 있음 지역 변수 – 기본 초기값이 없음 class Horse { private double height = 15.2; private String breed; // 나머지 코드 } class AddThing { …… public int add() { int total = a + b; return total; } class Foo { public void go() { int x; int z = x + 3; }

바보 같은 질문은 없습니다. 메소드 매개변수는 어떤가요? 지역 변수와 관련된 규칙이 매개변수에는 어떻게 적용되죠? 메소드 매개변수는 지역 변수와 거의 똑같습니다. 메소드 내에서 선언되지요. 다만 메소드를 호출할 때 필요한 인자를 전달하지 않으면 컴파일 과정에서 에러가 나기 때문에 매개변수가 초기화되지 않았다는 에러 메시지가 뜨는 일은 없습니다.

변수 비교 == 연산자 임의의 유형의 두 변수를 비교하기 위한 연산자 비트 패턴을 비교합니다. 원시값 레퍼런스 두 값을 직접 비교합니다. 레퍼런스 두 변수가 같은 객체를 참조하는지를 비교합니다. 00000011 00000011 int a = 3; byte b = 3; if (a == b) { // 참 } Foo a = new Foo(); Foo b = new Foo(); Foo c = a; if (a == b) { // 거짓 } if (a == c) { // 참 } if (b == c) { // 거짓 } a == b int byte

연필을 깎으며 메소드를 제대로 호출한 부분은? int calcArea(int height, int width) { return height * width; } int a = calcArea(7, 12); short c = 7; calcArea(c, 15); int d = calcArea(57); calcArea(2,3); long t = 42; int f = calcArea(t, 17); int g = calcArea(); calcArea(); byte h = calcArea(4, 20); int j = calcArea(2, 3, 5); 메소드를 제대로 호출한 부분은?