Class Class, Collections 514770-1 2017 년봄학기 3/22/2017 박경신 클래스 (Class) 객체의속성과행위선언 객체의설계도혹은틀 객체 (Object) 클래스의틀로찍어낸실체 메모리공간을갖는구체적인실체 클래스를구체화한객체를인스턴스 (instance) 라고부름 객체와인스턴스는같은뜻으로사용 클래스구조 클래스접근권한, public 다른클래스들에서이클래스를사용하거나접근할수있음을선언 클래스 (class) Person 이라는이름의클래스선언 클래스는 { 로시작하여 로닫으며이곳에모든필드와메소드구현 필드 (field) 값을저장할멤버변수 ( 혹은필드 ) 필드의접근지정자 public ( 다른클래스의메소드에서호출할수있도록공개한다는의미 ) 메소드 (method) 메소드는함수이며객체의행위를구현 메소드의접근지정자 public ( 다른클래스의메소드에서호출할수있도록공개한다는의미 ) 생성자 (constructor) 클래스의이름과동일한메소드 클래스의객체가생성될때만호출되는메소드 객체생성및사용예 객체생성 new 키워드를이용하여생성 new 는객체의생성자호출 객체생성과정 1. 객체에대한레퍼런스변수선언 2. 객체생성
접근지정자 디폴트 (default) 멤버 같은패키지내의다른클래스만접근가능 public 멤버 패키지에관계없이모든클래스에서접근가능 private 멤버 클래스내에서만접근가능 상속받은하위클래스에서도접근불가 protected 멤버 같은패키지내의다른모든클래스에서접근가능 상속받은하위클래스는다른패키지에있어도접근가능 Constructor 생성자 (Constructor) 객체가생성될때초기화를위해실행되는메소드 생성자의특징 생성자는메소드 생성자이름은클래스이름과동일 생성자는 new 를통해객체를생성할때만호출됨 생성자도오버로딩하여여러개작성가능 생성자는리턴타입을지정할수없음 생성자는하나이상선언되어야함 개발자가생성자를작성하지않았으면컴파일러에의해자동으로기본생성자가선언됨 기본생성자를디폴트생성자 (default constructor) 라고도함 Method 메소드 메소드는 C/C++ 의함수와동일 자바의모든메소드는반드시클래스안에있어야함 ( 캡슐화원칙 ) 메소드구성형식 접근지정자 public. private, protected, 디폴트 ( 접근지정자생략된경우 ) 리턴타입 메소드가반환하는값의데이터타입 get & set 설정자 (set) 에서매개변수를통하여잘못된값이넘어오는경우, 이를사전에차단할수있음. 필요할때마다필드값을계산하여반환할수있음. 접근자 (get) 만을제공하면자동적으로읽기만가능한필드를만들수있음.
Parameter Passing Primitive Type 인자전달 (Parameter Passing) 값에의한호출 (call by value) 기본타입의값을전달하는경우 값이복사되어전달 메소드의매개변수가변경되어도호출한실인자값은변경되지않음 Parameter Passing Reference Type 인자전달 (Parameter Passing) 객체 (object) 혹은배열 (array) 을전달하는경우 객체나배열의레퍼런스 (reference) 만전달 객체혹은배열이통째로복사되어전달되는것이아님 메소드의매개변수와호출한실인자가객체나배열을공유하게됨 Inheritance 상속 (Inheritance) 상위클래스의특성을하위클래스가물려받음 상위클래스 : 수퍼클래스, 하위클래스 : 서브클래스 서브클래스 수퍼클래스코드의재사용 새로운특성추가가능 자바는클래스다중상속없음 인터페이스를통해다중상속과같은효과얻음 상속과접근지정자 자바의접근지정자 (public, protected, default, private) 상속관계에서주의할접근지정자는 private와 protected 슈퍼클래스의 private 멤버 슈퍼클래스의 private 멤버는다른모든클래스에접근불허 슈퍼클래스의 protected 멤버 같은패키지내의모든클래스접근허용 동일패키지여부와상관없이서브클래스에서슈퍼클래스의 protected 멤버접근가능
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.id = x; public void set(int x) { this.id = x; public int get() {return id; super super 키워드 super 는슈퍼클래스의멤버를접근할때사용되는레퍼런스 서브클래스에서만사용 슈퍼클래스의메소드호출시사용 컴파일러는 super 호출을정적바인딩으로처리 Method Overloading 메소드오버로딩 (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) { return i + j; // 메소드오버로딩이실패한사례 class MethodOverloadingFail { public int getsum(int i, int j) { return i + j; public double getsum(int i, int j) { return (double)(i + j); Method Overriding 메소드오버라이딩 (Method Overriding) 슈퍼클래스의메소드를서브클래스에서재정의 슈퍼클래스의메소드이름, 메소드인자타입및개수, 리턴타입등모든것동일하게작성 이중하나라도다르면메소드오버라이딩실패 동적바인딩발생 서브클래스에오버라이딩된메소드가무조건실행되도록동적바인딩됨 동적바인딩발생 메소드 2() 오버라이딩
static vs. non-static non-static 멤버의특성 공간적 - 멤버들은객체마다독립적으로별도존재 인스턴스멤버라고도부름 시간적 - 필드와메소드는객체생성후비로소사용가능 비공유의특성 - 멤버들은여러객체에의해공유되지않고 배타적 static 멤버란? 객체를생성하지않고사용가능 클래스당하나만생성됨 클래스멤버라고도부름 객체마다생기는것이아님 특성 class StaticSample { int n; // non-static 필드 void g() {... // non-static 메소드 static int m; // static 필드 static void f() {... // static 메소드 공간적특성 - static 멤버들은클래스당하나만생성. 시간적특성 - static 멤버들은클래스가로딩될때공간할당. 공유의특성 - static 멤버들은동일한클래스의모든객체에의해공유 final final 클래스 - 더이상클래스상속불가능 final class FinalClass {... class DerivedClass extends FinalClass { // 컴파일오류... final 메소드 - 더이상오버라이딩불가능 public class SuperClass { protected final int finalmethod() {... class DerivedClass extends SuperClass { protected int finalmethod() {... // 컴파일오류, 오버라이딩할수없음 final 필드 상수정의 public class FinalFieldClass { static final int ROWS = 10; // 상수정의, 이때초기값 (10) 을반드시설정 객체의타입변환 업캐스팅 (upcasting) 프로그램에서이루어지는자동타입변환 서브클래스의레퍼런스값을슈퍼클래스레퍼런스에대입 슈퍼클래스레퍼런스가서브클래스객체를가리키게되는현상 객체내에있는모든멤버를접근할수없고슈퍼클래스의멤버만접근가능 class Person { class Student extends Person {... 객체의타입변환 다운캐스팅 (downcasting) 슈퍼클래스레퍼런스를서브클래스레퍼런스에대입 업캐스팅된것을다시원래대로되돌리는것 명시적으로타입지정 class Person { class Student extends Person {... Student s = (Student)p; // 다운캐스팅, 강제타입변환 Student s = new Student(); Person p = s; // 업캐스팅, 자동타입변환
instanceof 업캐스팅된레퍼런스로는객체의진짜타입을구분하기어려움 슈퍼클래스는여러서브클래스에상속되기때문 슈퍼클래스레퍼런스로서브클래스객체를가리킬수있음 instanceof 연산자 instanceof 연산자 레퍼런스가가리키는객체의진짜타입식별 사용법 Abstract Class & Method 추상메소드 (abstract method) 선언되어있으나구현되어있지않은메소드 abstract 키워드로선언 ex) public abstract int getvalue(); 추상메소드는서브클래스에서오버라이딩하여구현 추상클래스 (abstract class) 1. 추상메소드를하나라도가진클래스 클래스앞에반드시 abstract 라고선언해야함 2. 추상메소드가하나도없지만클래스앞에 abstract 로선언한경우 객체레퍼런스 instanceof 클래스타입 연산의결과 : true/false 의불린값 추상클래스 추상메소드 abstract class DObject { public DObject next; public DObject() { next = null; abstract public void draw() ; 추상클래스의상속 추상클래스의상속 2 가지경우 추상클래스의단순상속 추상클래스를상속받아, 추상메소드를구현하지않으면서브클래스도추상클래스됨 서브클래스도 abstract 로선언해야함 abstract class DObject { // 추상클래스 public DObject next; public DObject() { next = null; abstract public void draw(); // 추상메소드 abstract class Line extends DObject { // draw() 를구현하지않았기때문에추상클래스 public String tostring() { return "Line"; Polymorphism 다형성 (Polymorphism) 다형성 (polymorphism) 이란객체들의타입이다르면똑같은메시지가전달되더라도각객체의타입에따라서서로다른동작을하는것 (dynamic binding) 자바의다형성사례 슈퍼클래스의메소드를서브클래스마다다르게구현하는메소드오버라이딩 (overriding) 추상클래스구현상속 서브클래스에서슈퍼클래스의추상메소드구현 ( 오버라이딩 ) 서브클래스는추상클래스아님
자바의클래스계층구조 Object 의메소드 자바에서는모든클래스는반드시 java.lang.object 클래스를자동으로상속받는다. ArrayList<E> ArrayList<E> 의특성 java.util.arraylist, 가변크기배열을구현한클래스 <E> 에서 E 대신요소로사용할특정타입으로구체화 ArrayList 에삽입가능한것 객체, null 기본타입은박싱 / 언박싱으로 Wrapper 객체로만들어저장 ArrayList 에객체삽입 / 삭제 리스트의맨뒤에객체추가 리스트의중간에객체삽입 임의의위치에있는객체삭제가능 벡터와달리스레드동기화기능없음 다수스레드가동시에 ArrayList 에접근할때동기화되지않음 개발자가스레드동기화코드작성 ArrayList<String> 컬렉션의내부구성 add() 를이용하여요소를삽입하고 get() 을이용하여요소를검색합니다 ArrayList<String> = new ArrayList<String>();
ArrayList<E> 클래스의주요메소드 30 ArrayList 에문자열을달기 키보드로문자열을입력받아 ArrayList 에삽입하고가장긴이름을출력하라. import java.util.*; public class ArrayListEx { public static void main(string[] args) { // 문자열만삽입가능한 ArrayList 컬렉션생성 ArrayList<String> a = new ArrayList<String>(); // 키보드로부터 4 개의이름입력받아 ArrayList 에삽입 Scanner scanner = new Scanner(System.in); for(int i=0; i<4; i++) { System.out.print(" 이름을입력하세요 >>"); String s = scanner.next(); // 키보드로부터이름입력 a.add(s); // ArrayList 컬렉션에삽입