[Java] 3. Object, Array, 복습

Nam_JU·2022년 7월 17일
0

KaKao Cloud School

목록 보기
8/19


Java가 제공하는 API (class Library)

  • package화 되어서 제공한다 그래서 java. 패키지명 사용 불가
    • 언어에 대한 기능 : java.lang.Object
    • 자바의 네트워킹 프로그램 : java.net.xxx
    • 화면에 창을 띄울때 사용하는 프로그램 : java.awt.xxxx
  • API reference에서 확인해야 함 Object (Java SE 11 )

Object

  • Object 클래스는 모든 자바 클래스가 상속하는 최상위 클래스이다
  • Object 클래스는 모두 11개의 메소드를 정의하고 있으며 이 메소드들은 자바의 모든 클래스가 갖는 기능이다
  • 자바의 모든 클래스가 상속 받아 갖는 Object 클래스 메소드에 대한 목적과 기능을 이해하는 것이 중요하다
  • Object 클래스를 통해 상속을 받는 메소드의 의미를 이해해야 그의미에 맞게 재정의 할 수 있다

equals() : 객체끼리 비교할때 사용

  • 상위 클래스(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));
    }
}

toString() : 객체를 문자열로 변환시키는 것

  • 해당 클래스에 대한 설명을 문자열 타입으로 반환하는 메소드이다
  • 자바의 모든 클래스는 스스로에 대한 정보를 읽기 쉬운 형태로 제공 할 수 있으며 이 기능이 toString()메소드이다
  • 클래스를 정의할 때 그 클래스를 나타내는 주요 정보를 이용해 toString()메소드로 재정의한다
//보이지는 않지만 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}
    }
}

배열 Array

  • 사이즈가 동적으로 변할 수 없다
  • 하나의 데이터타입을 써야한다 (동일한 데이터 타입)

Collection

배열을 지양하고 클래스를 사용할 것

  • List 계열
    • ArrayList Class
      • 사이즈가 동적으로 변할 수 있다
      • 서로다른 데이터타입이 들어올 수 있다
      • 저장할때 반드시 객체(인스턴스)로 저장해야 한다
    • LinkedList Class
  • Map 계열
    • Hash Map Class
  • Set 계열
    • Hash Set Class

String

  • “ ” 문자열을 생성하는 방법
  1. String a = “Hello”;
  2. new String(”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() 사용
        //문자열 내용이 같은지 확인할때 == 사용하지 않는다 
    }
}

wrapper class

  • class는 객체를 만들기 위해 사용

ArrayList

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); //에러
    }

}

Map

  • JSON 타입 Key,Value 쌍으로 데이터를 저장할 수 있는 구조이다
  • key와 value를 각각 객체로 저장한다


클래스 Class

  1. 객체 모델링의 수단(현실세계의 문제를 코드로 짜기위한 방식)
  2. 인스턴스를 파생시키는 목적으로 사용한다 (new 생성자)
  3. ADT (Abstract Data Type 추상데이터타입)
    • 자바에서는 참조타입 referrence type이라고 함

인스턴스 new (생성자호출)

  • 객체를 만들려면 생성자 호출을 해야한다. 생성자 호출을 하려면 메모리공간을 만들어야함
    • new 키워드로 메모리 공간을 생성한다 (클래스안에들어가있는 데이터를 보고 몇바이트짜리 인스턴스 공간을 만들지 확보를 한다)
    • 인스턴스 자체는 메모리 공간이기 때문에 사용하기 위해서는 메모리주소를 가지고있는 변수가 필요하다. (클래스안의 인스턴스 변수(참조변수)가 될수 있고 메서드의 지역변수일수도 있다)

생성자 Constructor

  • 클래스의 구성요소중 하나 (생성자들, 필드들, 메소드들)
  • 인스턴스를 생성하고 초기화하려는 목적으로 사용
  • 모든 클래스는 적어도 1개 이상의 생성자를 가지고 있다
    • 생성자 오버로딩에 의해 여러개를 생성할 수 있다
  • 이름이 클래스이름과 동일하다
  • 메소드와 같은 return이 없다
  • 내가 작성하지 않으면 default 생성자가 (명시적으로) 자동으로 생성된다
    • default 생성자 안쓰더라도 꼭 명시하는게 좋다

JVM이 관리하는 메모리 공간

  • register: 프로그램의 실행 포인터 (다음 어디코드를 실행할지 트랙킹)
  • Runtime construct pool: (모여져있는 공간 pool) JVM에 의해 상수(재할당안됨)들이 모여 관리되는 공간
  • Method Area: 클래스들이 가지고 있는 static fields(Class variable)이 method Area에 잡힌다
    • class 자체에 대한 정보
    • 처음 사용을 하게될때 동적으로 올라옴 (정말 실행이 될때 올라오기도 함)
    • method의 실행 byte code
  • Heap: new로 만들어진 객체는 전부 heap에 할당된다. S
    • tring pool이라는 조그마한 영역을 힙안에 가지고 있다. 여기서 문자열(String 객체)을 관리한다
  • Call Stack: 메서드가 호출되면 무조건 stack에 영역이 잡힌다 (method를 위한 공간이 잡힌다)
    • method안에서 사용하는 지역변수 localvariable이 이 공간에 위치를 하게된다

Class Variable, Instance Variable

  • Class variable : static field를 의미함
    • 모든 인스턴스가 공유하는 공간
  • Instanc Variable: 일반 필드를 의미한다
    • heap에 인스턴스마다 각각의 독립적인 공간을 가지고 있다

Method Overloading 메소드 오버로딩

  • 메소드의 이름(식별자)가 같아도 파라미터Parameter의 수나 데이터타입이 다르면
    다른 메소드로 구분하겠다는 의미.

Package 패키지

  • 자바의 모든 클래스는 특정 패키지안에 들어가 있다
    • (내가 안적어도 default package에 들어가있음)
  • 패키지가 없으면 같은 이름의 클래스를 구별할수가 없다
    • 즉 Class이름이 같아도 package가 다르면 다른 class!
  • 클래스의 유지보수 및 관리를 위해 클래스를 논리적으로 묶어주는 개념이다
    • 패키지이름의 폴더가 생성되고 그안에 클래스를 위치 시킨다
    • 다른 패키지를 사용하기 위한 방법은?
      package로 묶여 있는 class는 사용할 때 pull package명을 써줘야 한다 (import 구문을 사용)

Access Modifier 접근 제어자

  • 외부에서 데이터를 접근하는것으 방지하고 보호하기 위해서, 내가만든 코드를 공유하기 위해서
  • 클래스 앞에는 무조건 접근 제어자를 붙여야 한다
    (클래스 앞에는 public이 붙거나 안붙거나 둘중 하나이다 안쓰는 경우는 package default가 붙음)
  • 클래스 안에 있는 fielld, constructor, method에도 앞에 붙는다
    1. public : 패키지에 상관없이 사용가능하다 다른 패키지에도 사용 가능
    2. protected: 같은 패키지 접속가능, 다른 패키지의 경우는 상속관계만 접근이 가능하다
    3. package(defult): 같은 패키지 내에서만 접근 가능
    4. private: 같은 패키지 X , 같은 클래스내부에서만 사용 가능

Inheritance 상속

  • 객체지향에서 코드를 재활용할수 있는 가장 대표적인 기법
  • 기존 클래스를 확장시켜서 새로운 클래스를 정의하는 방법
  • 상속이 안되는것
    • 생성자 Constructor는 상속이 안된다
    • private 요소들은 안됨(field, method)

  • 자바는 단일 상속만 지원한다 Is a Relationship
  • 클래스로부터 파생된 객체의 데이터타입을 상위타입으로 변환할 수 있다 = 다형성
  • 인스턴스 생성과정이 복잡하다
    • 생성자가 연속적으로 호출되어야한다
    • Super() : 상위클래스를 호출하는 방법


Final

  • final → 변수 앞에 붙으면 상수처리 final int =100;
  • class에 붙으면 final class A{} → 상속이 안된다
  • method앞에 붙으면 final void (){} → 재정의하지 못한다
    • 3곳에 붙음
      • 변수앞에서 붙을때 : 상수라는 의미
      • 클래스 앞에서 붙을때: 상속이 더이상 일어나지 않는다
      • 메소드 method 앞에서 붙을때 : 오버라이딩이 안된다

추상 클래스 Abstract Class

  • 추상클래스는 하나 이상의 추상 메소드 (abstract method)를 갖는 클래스이다
    (추상클래스가 가지고있는 메소드중에 하나라도 abstract 추상메소드를 가지고 있으면 추상클래스이다)
  • 추상메소드란?
    자식 클래스에서 재정의 하도록 하기위한 메소드이다
    메소드 선언만 되어있고 하는일이 정의가 되어있지 않은 메소드
    당연히 abstract 키워드가 붙어있어야함
  • 추상 클래스는 상속 관계에서 부모 클래스의 역할을 갖기 위한 클래스이며 추상 메소드와 일반 메소드를 가질 수 있다
  • 추상 클래스는 new 동적 할당자를 통해 인스턴스 객체를 만들 수 없다
    - 그려면?
    상속으로 하위클래스에 메소드오버라이딩 해서 인스턴스를 생성해 사용해야함
    - 하위클래스에 강제시키는 역할을 한다

인스턴스를 만들지도 못하는데 생성자를 만든 이유는?
super()자식 클래스가 부모클래스를 호출 하기 위함


인터페이스 Interface

  • 인터페이스는 일반적으로 추상 메소드만 가지며 interface 키워드를 이용해 정의한다
  • 특정 클래스가 인터페이스를 구현하기 위해서는 implements 키워드를 통해 구현한다
  • 안에 있는 field는 public static final이 자동을 붙는다
    • 필드는 전부 상수이다.
  • 메소드는 모두 추상메소드 abstract method이다
  • 인터페이스는 다중구현이 가능하다 (클래스는 다중상속이 안됨)
    • 클래스는 당일상속만 가능 → 클래스는 상속한다고 표현한다 is-a 관계
    • 인터페이스는 다중 구현이 가능 → 인터페이스는 구현한다고 표현한다 is-a 관계
  • Is-a 관계는 상위 타입을 사용할수 있다
  • 인터페이스를 통해 설계와 구현을 완전히 분리 할 수 있다

추상클래스의 아주 특별한 형태 Interface

  1. 클래스처럼 생겼지만 모든 메서드가 추성메서드이다
  2. 클래스처럼 생겼지만 필드는 모두 public static final로 되어있다
    1. 이런 클래스를 인터페이스라고 한다
    2. 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 {
}


참고자료
https://velog.io/@jyyoun1022/java.lang-패키지-Object

profile
개발기록

0개의 댓글