java.lang.Object
java.net.xxx
java.awt.xxxx
- Object 클래스는 모든 자바 클래스가 상속하는 최상위 클래스이다
- Object 클래스는 모두 11개의 메소드를 정의하고 있으며 이 메소드들은 자바의 모든 클래스가 갖는 기능이다
- 자바의 모든 클래스가 상속 받아 갖는 Object 클래스 메소드에 대한 목적과 기능을 이해하는 것이 중요하다
- Object 클래스를 통해 상속을 받는 메소드의 의미를 이해해야 그의미에 맞게 재정의 할 수 있다
//보이지는 않지만 Object를 상속하고 있다
class Student extends Object{
private String name;
private int age;
//default 생성자
public Student() {
}
//인스턴스를 만들기 위한 생성자
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//오버라이딩 (상위Object의 메서드를 재정의하여 사용)
@Override //is-a 관계로 인해 하위클래스는 상위클래스의 타입을 사용가능하다
public boolean equals(Object obj) {
//상위는 하위의 Student 타입이 없음으로 다운캐스팅을 한다
//Object 타입의 obj를 Student 타입으로 변경
Student tmp = (Student) obj;
boolean result = false; //원래는 false 지만 조건후 변경
if (this.name == tmp.name && this.age == tmp.age){
result = true;
}
return true;
}
}
public class Main {
public static void main(String[] args) {
Student s1 = new Student("홍길동",20);
Student s2 = new Student("홍길동",20);
System.out.println(s1 == s2); //메모리 주소가 같은지 - false
// System.out.println(s1.equals(s2)); //false Object를 써도 주솟값 비교를 한다
//하지만 재정의 오버라딩 Oberiding을 하면 커스텀 가능
System.out.println(s1.equals(s2));
}
}
//보이지는 않지만 Object를 상속하고 있다
class Student extends Object{
private String name;
private int age;
//default 생성자
public Student() {
}
//인스턴스를 만들기 위한 생성자
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + this.name + '\'' +
", age=" + this.age +
'}';
}
}
public class Main {
public static void main(String[] args) {
Student s1 = new Student("홍길동",20);
Student s2 = new Student("홍길동",20);
// System.out.println(s1); //객체를 문자열로 뽑고싶을때 -> string.Student@58ceff1
// System.out.println(s1.toString()); //원래자동적으로 toString이 붙는다 ->string.Student@58ceff1
//객체가 가진 내용을 내가 원하는 형태로 받고 싶을때
System.out.println(s1); //Student{name='홍길동', age=20}
}
}
배열을 지양하고 클래스를 사용할 것
String a = “Hello”;
String b = new String(”Hello”);
String은 StringPool에서 별도로 관리를 한다.
public class Main {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); //힙의 stringPool에서 관리됨
System.out.println(str1 == str3); //힙메모리에 따로 생성
System.out.println(str1.equals(str3)); //true
//문장열 내용을 비교할때는 당연히 equals() 사용
//문자열 내용이 같은지 확인할때 == 사용하지 않는다
}
}
import java.util.ArrayList;
import java.util.List;
class Student{
}
public class Main {
public static void main(String[] args) {
//Arraylist는 배열과 비슷하다다
//저장은 무조건 객체형태로 해야한다
List list = new ArrayList<>();
list.add("Hello");
list.add("홍길동");
list.add(100); //다른 타입이 들어가도 된다 = 저장된것 처럼 보임 -> collection은 객체밖 못 넣는다
//list.add(new Integer(100)); 자동적으로 객체화가 됨됨
list.add(new Student()); //객체이기만 하면 다 집어넣을 수 있다
//List를 만들어서 사용할거다
//같은 데이터타입을 이용하는 경우가 사실 대부분이다
List<String>list1 = new ArrayList<String>(); //arrayList안에 String만 들어오겠다
//상위타입도 지정
list1.add("홍길동");
list1.add(100); //에러
}
}
- public : 패키지에 상관없이 사용가능하다 다른 패키지에도 사용 가능
- protected: 같은 패키지 접속가능, 다른 패키지의 경우는 상속관계만 접근이 가능하다
- package(defult): 같은 패키지 내에서만 접근 가능
- private: 같은 패키지 X , 같은 클래스내부에서만 사용 가능
- 객체지향에서 코드를 재활용할수 있는 가장 대표적인 기법
- 기존 클래스를 확장시켜서 새로운 클래스를 정의하는 방법
- 상속이 안되는것
- 생성자 Constructor는 상속이 안된다
- private 요소들은 안됨(field, method)
- 자바는 단일 상속만 지원한다 Is a Relationship
- 클래스로부터 파생된 객체의 데이터타입을 상위타입으로 변환할 수 있다 = 다형성
- 인스턴스 생성과정이 복잡하다
- 생성자가 연속적으로 호출되어야한다
- Super() : 상위클래스를 호출하는 방법
- 3곳에 붙음
- 변수앞에서 붙을때 : 상수라는 의미
- 클래스 앞에서 붙을때: 상속이 더이상 일어나지 않는다
- 메소드 method 앞에서 붙을때 : 오버라이딩이 안된다
- 추상클래스는 하나 이상의 추상 메소드 (abstract method)를 갖는 클래스이다
(추상클래스가 가지고있는 메소드중에 하나라도 abstract 추상메소드를 가지고 있으면 추상클래스이다)
- 추상메소드란?
자식 클래스에서 재정의 하도록 하기위한 메소드이다
메소드 선언만 되어있고 하는일이 정의가 되어있지 않은 메소드
당연히 abstract 키워드가 붙어있어야함
- 추상 클래스는 상속 관계에서 부모 클래스의 역할을 갖기 위한 클래스이며 추상 메소드와 일반 메소드를 가질 수 있다
- 추상 클래스는 new 동적 할당자를 통해 인스턴스 객체를 만들 수 없다
- 그려면?
상속으로 하위클래스에 메소드오버라이딩 해서 인스턴스를 생성해 사용해야함
- 하위클래스에 강제시키는 역할을 한다
인스턴스를 만들지도 못하는데 생성자를 만든 이유는?
super()
자식 클래스가 부모클래스를 호출 하기 위함
- 인터페이스는 일반적으로 추상 메소드만 가지며 interface 키워드를 이용해 정의한다
- 특정 클래스가 인터페이스를 구현하기 위해서는 implements 키워드를 통해 구현한다
- 안에 있는 field는 public static final이 자동을 붙는다
- 즉 필드는 전부 상수이다.
- 메소드는 모두 추상메소드 abstract method이다
- 인터페이스는 다중구현이 가능하다 (클래스는 다중상속이 안됨)
- 클래스는 당일상속만 가능 → 클래스는 상속한다고 표현한다 is-a 관계
- 인터페이스는 다중 구현이 가능 → 인터페이스는 구현한다고 표현한다 is-a 관계
- Is-a 관계는 상위 타입을 사용할수 있다
- 인터페이스를 통해 설계와 구현을 완전히 분리 할 수 있다
추상클래스의 아주 특별한 형태 Interface
- 클래스처럼 생겼지만 모든 메서드가 추성메서드이다
- 클래스처럼 생겼지만 필드는 모두 public static final로 되어있다
- 이런 클래스를 인터페이스라고 한다
- is-a 관계가 성립된다
인터페이스 역할
- 하나의 프로그램은 다수의 클래스들이 서로 관계를 형성하게 되고 각 클래스들은 역할에 따라 구분한다
- 클래스들간에 관계를 밀접하게 구성하게 되면 특정 클래스에서 변경이 일어날 경우 많은 클래스들이 영향을 받는다
- 따라서 클래스 간에 관계를 구성할 때 그 관계를 느슨하게 관리해 줄 수 있는것이 인터페이스
- 클래스와 클래스 사이에 인터페이스를 구성하면 직접적인 접근이 없는 느슨한 관계를 구성 할 수 있다
//부모클래스와 같은 개념으로 사용
interface Animal{
public static final int age = 20; //원래는 이 형태이다
int weight = 10;
public abstract void printName(); //인터페이스 안에는 무조건 추상메소드임으로 abstract 이 생략됨
public void printAge();
}
//앞에가 인터페이스이면 뒤에도 인터페이스여야한다
//상속은 같은 종류에서 일어나야함 (클래스와 인터페이스 관계는 구현이라는 키워드를 사용)
abstract class MyClass implements Animal{
//추상클래스가 되면 오버라딩을 할수 없다
}
public class Main {
}
//하나의 클래스가 있고 하나의 인터페이스가 있을때 어떻게 구현할것인가
class Human{
}
//부모클래스와 같은 개념으로 사용
interface Animal{
public static final int age = 20; //원래는 이 형태이다
int weight = 10;
public abstract void printName(); //인터페이스 안에는 무조건 추상메소드임으로 abstract 이 생략됨
public void printAge();
}
//앞에가 인터페이스이면 뒤에도 인터페이스여야한다
//상속은 같은 종류에서 일어나야함 (클래스와 인터페이스 관계는 구현이라는 키워드를 사용)
class MyClass extends Human implements Animal{
//Human 클래스를 상속하는것이고 Animal를 구현하는 것이다
@Override
public void printName() {
}
@Override
public void printAge() {
}
}
public class Main {
}
interface MyInterface{
}
class Human{
}
//부모클래스와 같은 개념으로 사용
interface Animal{
public static final int age = 20; //원래는 이 형태이다
int weight = 10;
public abstract void printName(); //인터페이스 안에는 무조건 추상메소드임으로 abstract 이 생략됨
public void printAge();
}
//앞에가 인터페이스이면 뒤에도 인터페이스여야한다
//상속은 같은 종류에서 일어나야함 (클래스와 인터페이스 관계는 구현이라는 키워드를 사용)
class MyClass extends Human implements Animal, MyInterface{
//Human 클래스를 상속하는것이고 Animal를 구현하는 것이다
@Override
public void printName() {
}
@Override
public void printAge() {
}
}
public class Main {
}