상지대학교컴퓨터정보공학부 고광만 1
클래스와객체 필드 메소드 중첩클래스 자료추상화 [2/35]
클래스 (Class) 자바프로그램의기본단위 재사용성 (reusability), 이식성, 유연성증가 객체를정의하는템플릿 객체자료형 (object type) 하나의사용자정의자료형 (User-defined data type) 자료추상화 (data abstraction) 의방법 객체 (Object) 클래스의인스턴스로변수와같은역할객체를정의하기위해서는해당하는클래스를정의 [3/35]
클래스선언형태 [modifier] class ClassName { // field declarations public, final, // method declarations abstract 객체의구조를기술하는자료부분 ( 변수, 상수 ) 객체의행위를정의하는메소드부분 public 다른패키지에서사용가능하나의소스파일에는한개이하의 public 클래스 소스파일의이름은반드시 public 클래스이름과동일 [4/35]
클래스선언예 public class Fraction { int numerator; int denominator; // 분수클래스 // 분자필드 // 분모필드 public Fraction add(fraction f) /*... */ // 덧셈메소드 public Fraction mul(fraction f) /*... */ // 곱셈메소드 public void printfraction() /*... */ // 프린트메소드 객체선언 객체를참조 (reference) 하는변수를선언 예 : Fraction f1, f2; [5/35]
객체생성 f1 = new Fraction(); Fraction f1 = new Fraction(); 생성자 생성자 : 객체를생성할때초기화를위해컴파일러에의해자동으로호출되는루틴 객체참조 필드의참조형태 : objectname.fieldname 메소드의참조형태 : objectname.methodname f1.numerator f1.add(f2) [6/35]
객체의구조를기술하는자료부분 객체의상태를표시 필드선언 형태 : 예 [qualifier] DataType fieldnames; where, qualifier : Œ access modifier static, final, volatile int aninteger, anotherintegrer; public String usage; static long idnum = 0; public static final double earthweight = 5.97e24; [7/35]
접근수정자 (access modifier) 다른클래스에서필드의접근허용정도를나타내는부분 public, protected, private 접근수정자 클래스 서브클래스 같은패키지 모든클래스 private O X X X package O X O X protected O O O X public O O O O 선언예 private int i; int j; protected int k; public int sum; // private // package // protected // public [8/35]
private 정의된클래스내에서만필드접근이허용 필드에저장된값을외부에서변경하는경우를제한 예 ) class PrivateAccess { private int iamprivate; // class AnotherClass { void accessmethod() { PrivateAccess pa = new PrivateAccess(); pa.iamprivate = 10; // 에러 [9/35]
public 모든클래스및패키지에서자유롭게접근 class PublicAccess { public int iampublic; // package class AnotherClass { void accessmethod() { PublicAccess pa = new PublicAccess(); pa.iampublic = 10; // OK 접근수정자없이선언된필드동일패키지내에서자유롭게접근 protected 동일패키지및서브클래스에서필드의접근 (6 장참고 ) [10/35]
static 정적변수, 클래스변수 (class variable) 클래스단위로존재하여그클래스로부터만들어진모든객체가공유할수있는변수 class StaticVariable { public static int numofitems = 0; public int value; // // StaticVariable p = new StaticVariable(); 정적변수참조 StaticVariable.numOfItems 가능 ( 객체생성없이 ) [11/35]
final 값이변할수없다는속성 static + final 상수 class QualifierExample { int aninteger; static int staticinteger = 0; static final double p = 3.14159265358979323846; volatile 특정한필드에대하여다른곳에서값이변할수있기때문 상수전파와같은최적화를방지하고자할때사용 [12/35]
객체의행위를기술하는방법 프로그램코드를포함하고있는함수의형태 객체는메소드호출을통하여객체에대한작업을수행 선언형태 [qualifier] returntype methodname(parameterlist) { // method body qualifier : 접근수정자, static, final, native, synchronized returntype : 반환값이없으면 void 메소드이름의첫글자는일반적으로소문자로씀. 참고 : 클래스이름의첫글자는일반적으로대문자로씀. [13/35]
메소드선언예 Simple method class MethodExample { int simplemethod() { //... public void emptymethod() { tostring method public String tostring() { String form = numerator + "/" + denominator; return form; 객체의외부표현 (external representation) 을위해객체를스트링으로변환하는메소드 객체를 + 나 += 과같은스트링연산자의피연산자로사용하면, tostring 메소드가묵시적으로호출 "string value = " + obj [14/35]
[ 예제 5.2- ExampleOftoString.java] class Fraction { int numerator; int denominator; // 분자 // 분모 Fraction(int num, int denom) { numerator = num; denominator = denom; // 생성자 public String tostring() { String form = numerator + "/" + denominator; return form; public class ExampleOftoString { public static void main(string[] args) { Fraction f = new Fraction(1,2); System.out.println("Implicit call = " + f); System.out.println("Explicit call = " + f.tostring()); 실행결과 : Implicit call = 1/2 Explicit call = ½ [15/35]
메소드자격자 접근수정자 static 다른클래스에서메소드의접근허용정도필드의접근수정자와의미가동등 정적메소드 (static method), 클래스메소드 (class method) 전역함수 (global function) 와같은역할해당클래스의정적필드혹은다른정적메소드만을사용클래스이름만으로도참조가능 ClassName.methodName; [16/35]
final 최종메소드 (final method) 서브클래스에서재정의할수없는속성 synchronized 동기화메소드 항상하나의스레드만이접근할수있도록제어하는기능 native C 언어와같은다른프로그래밍언어로쓰여진구현부분을이용 [17/35]
메소드내에서만참조될수있는지역변수 class Fraction { int numerator, denominator; // 필드 public Fraction(int numerator, int denominator) { // 매개변수 //... 매개변수전달값호출 (call by value) 참조호출 (call by reference) void parameterpass(int i, Fraction f) { //... [18/35]
main 메소드의매개변수 main 메소드의형태 public static void main(string[] args) { // 명령어라인에서전달 명령어라인 : args[0] args[1] args[2] java ClassName args1 args2 args3 [19/35]
메소드중복 (method overloading) 메소드이름은같은데매개변수의개수와형이다른경우 void methodover(int i) { /*... */ // 첫번째형태 void methodover(int i, int j) { /*... */ // 두번째형태메소드가중복된경우, 호출시구별은컴파일러가행함. 시그네춰 (signature) 메소드를구별하는데쓰이는정보 Œ 메소드의이름 매개변수의개수 Ž 매개변수의형 [20/35]
[ 예제 5.8- MethodOverloading.java] public class MethodOverloading { void something() { System.out.println("someThing() is called."); void something(int i) { System.out.println("someThing(int) is called."); void something(int i, int j) { System.out.println("someThing(int,int) is called."); public static void main(string[] args) { MethodOverloading m = new MethodOverloading(); m.something(); m.something(526); m.something(54, 526); 실행결과 : something() is called. something(int) is called. something(int,int) is called. [21/35]
객체가 new 연산자에의해생성될때자동으로불려지는메소드 이름 복귀형기능 : 클래스이름과동일 : 명시하지않음 : 주로객체를초기화하는작업 class Fraction { //... Fraction(int a, int b) { numerator = a; denominator = b; Fraction f = new Fraction(1,2); [22/35]
실행시점 클래스내의필드들이모두초기화된후 [ 예제 5.10] 테스트 교과서 195 쪽 디폴트생성자 (default constructor) 매개변수를갖지않는생성자를의미 생성자를정의하지않았을때 this() 명시적으로클래스내에있는다른생성자를호출 반드시생성자의첫문장 [23/35]
public class ThisConstructor { ThisConstructor() { System.out.println( Default Constructor ); ThisConstructor(int a) { this(); System.out.println( Constructor with one parameter ); public static void main(string[] args) { ThisConstructor obj = new ThisConstructor(10); System.out.println( End of main ); [24/35]
클래스안에선언된정적변수를초기화할때함께실행되는문장 형식 static { < 문장 > [25/35]
실행순서정적초기화문과정적변수를초기화하는순서는소스프로그램에존재하는순서 class Initializers { static { i = j + 2; static int i, j; static { j = 4; //... // 에러 생성자보다먼저실행 [ 예제 5.13] 테스트 교과서 199 쪽 [26/35]
Garbage Collector 자동적인메모리관리 finalize 메소드 가비지콜렉터가메모리를회수하기전에그객체의 finalize 메소드를 호출 자원을해제할수있는방법제공프로그래머는 finalize 메소드를통하여가비지콜렉터가회수할수없는자원을직접제거 protected void finalize() throws Throwable { //... [ 예제 5.14] 테스트 가비지콜렉터의호출이이루어지지않음 [27/35]
클래스의내부에서정의된클래스 클래스내부에서사용하고자하는객체형을정의할수있는방법을제공클래스의참조범위를제한하여클래스의이름충돌문제를해결정보은닉화 (information hiding) class OuterClass { //... class InnerClass { //... [28/35]
이름참조 OuterClass 내부 : InnerClass 단순명을사용 OuterClass 외부 : OuterClass.InnerClass public static void main(string[] args) { OuterClass outobj = new OuterClass(); OuterClass.InnerClass inobj = outobj.new InnerClass(); [ 예제 5.15] 테스트 접근수정자 public, private, protected 중첩클래스는정적변수를가질수없음 [29/35]
정적중첩클래스 지정어 static 을사용하여정의 정적변수사용가능 class OuterClass { //... static class InnerClass { static int staticvariable; //... OuterClass.InnerClass 객체생성없이참조가능 [30/35]
모든클래스에대해 *.class 파일을생성 명칭의형태 : 외부클래스이름 $ 중첩클래스이름 자바소스 클래스이름.class 외부클래스이름 $ 중첩클래스이름.class class Outer { class Inner1 { class Inner2 { // //... //... Outer.class Outer$Inner1.class Outer$Inner1$Inner2.class [31/35]
Data Abstraction 자료구조와함께그에해당하는연산들을정의 Abstract Data Type ::= Data structures + Operations 기본형처럼프로그래머가사용재사용할수있는소프트웨어부품화정보은닉화 (Information hiding) 언어의확장성증가 자바는클래스를제공하여추상자료형을정의 [32/35]
클래스를이용하여분수를다루는방법을구현 분자, 분모를가진클래스정의 class Fraction { int numerator; // 분자 int denominator; // 분모 분수를다루는연산 ( 덧셈, 뺄셈, 곱셈, 나눗셈 ) 과출력 public Fraction add(fraction); public Fraction sub(fraction); public Fraction mul(fraction); public Fraction div(fraction); public String tostring(); [33/35]