김미썸코딩

11/11 - Java (3) : 생성자, final, 객체 참조 배열, 상속, 오버라이딩 본문

빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정

11/11 - Java (3) : 생성자, final, 객체 참조 배열, 상속, 오버라이딩

김미썸 2020. 11. 11. 17:17
728x90

복습 & 개념정리

1. 배열

           일차원

           다차원

                     - 데이터(엑셀)

                     - 2차원 (유사)배열

 

2. 데이터타입

           * 메모리

           1) 기본형

                     int

           2) 참조형

                    개발자 선언          

 

 

 

        사물                                                                                                                                             인스턴스

        사물        (공통)      객체(속성, 기능)      (코딩)     class(필드, 메서드)      (데이터)       인스턴스

        사물                                                                                                                                               인스턴스

 

 

 

  • 공통 - 추상화

             객체 모델링 - UML(Unified Modeling Language) - UML다이어그램 staruml.io/

 

StarUML

UML 2 Compatible with UML 2.x standard metamodel and diagrams: Class, Object, Use Case, Component, Deployment, Composite Structure, Sequence, Communication, Statechart, Activity, Timing, Interaction Overflow, Information Flow and Profile Diagram. SysML Sup

staruml.io

  •  데이터 - 인스턴스화

 

 

 

 

3. 객체

  •  캡슐화
  •  상속성

                        추상화

                        다형성

 

 

4. class

             (멤버)필드

                        인스턴스 필드

                        클래스(static) 필드

             메서드

                        인스턴스 메서드

                        클래스(static) 메서드

 

                        * 지역변수, 제어문

                        * overloading

 

 

5. 인스턴스

 

클래스명 객체변수;

객체변수 = new 클래스명();        // new 는 메모리 생성 연산자

 

객체변수.필드

객체변수.메서드

 

 

 


 

 

 

 

 

 

 

 

 

클래스


 

※ 클래스 작성법

  • 파일 1개 - 클래스 1개가 원칙
  • 파일 내에 class가 한개일 때는 public 생략 가능
  • java를 실행시키면 실행 클래스를 찾아간다.
  • 실행 클래스는 public static void main(String [] args) 이다
  • 실행마다 다른 옵션을 주고 싶을 때 아래처럼 실행할 때 옵션 값을 줘서 args값을 넣는다.
  • 여러개의 파일에 클래스를 하나씩 만들고 main파일에서 참조할 수 있다. (클래스 모듈화)

 

 

 

 

 

1. 생성자 함수 ( Constructor)

▷p203

new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

  • 클래스명과 같다.
  • return타입이 없다. (이미정해진 return타입이 있음)
  • 모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.
  • 생성자를 생략하면 기본 생성자가 생성된다.
  • 때문에 생성자를 선언하지 않아도 다음과 같이 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성시킬 수 있다.                    
  • 기존에 new를 써서   Student s = new Student(); 로 객체를 생성한게 사실은 생성자 함수를 사용한 것이였다.
  • 클래스가 public class 로 선언되면 기본 생성자에서도 public이 붙지만, 클래스가 public이 없이 class로만 선언되면 기본생성자에도 public이 붙지 않는다.
  • s.Student(); 처럼 직접 호출 불가능
  • 반드시 new를 써서 객체를 생성할 때 호출 가능
  • 기본생성자는 다른 생성자함수가 없을 땐 자동 생성되지만, 다른 생성자함수가 있다면 써줘야한다.

 

 

 

1-1. 생성자 함수 오버로딩

▷p208

Car car1 = new Car();
Car car2 = new Car("그랜저");

이와같이 어떤 형태로 어떤 인자를 주면서 객체를 생성하느냐에 따라 다른 생성자가 호출되며,

클래스 내에 정의된 고정된 멤버변수 값이 아닌 값이 다른 멤버 변수를 가지는 객체를 생성할 수 있다.

 

 

 

 

 

1-2. 다른 생성자 호출 (this())

▷p212

생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 발생을 줄이기 위함이다. 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선시킨 것이다. 

Car("000","소나타"); 처럼 직접호출이 불가능하므로  this()를 사용한다.

  • this는 참조주소이고, this()는 생성자이다.
  • this()는 호출될 때 첫줄에 와야한다. 중간에 올수 없다.
  • 파라미터가 많은 생성자가 초기화를 집중적으로 담당한다. 다른 생성자들은 이 생성자를 호출해서 초기화 한다.

 

 

 

 

 

 

2. 블럭 (Block)

▷p239

  • 멤버필드의 초기화를 하기 위함이다.
  • main함수 내에 있는 것을 외부 클래스에서 하는 것과 같다.
  • 클래스 내부에서 실행문을 쓸수 없기 때문에 간접적으로 실행문을 쓰려고 사용한다. 생성자를 사용하는 것이 낫다.
  • 인스턴스 필드는 생성자에서 초기화 되지만, 정적필드(static)는 객체 마다 다 같은 값이므로 객체 생성 없이도 사용해야 하기 때문에 생성자에서 초기화 수 없다.
  • 정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다. (클래스파일 만들때 실행됨)
  • static 변수를 필드에 선언해 놓고 초기화는 다른 곳에 하게 되면 초기화는 객체가 생성될 때 된다.
  • 따라서, static 변수의 선언과 초기화를 따로 할때, 초기화를 static 블록 안에 넣어줘야한다.

 

 

 

 

3. final 필드와 상수

3-1. final 필드

▷p245

 

 

3-2. 상수 (static final)

▷p246

변수명을 대문자로 써주는 것이 좋다.

 

 

 

 

4. 객체를 참조하는 배열

▷p165

  • 기본타입(byte, char, float, int, long, float, double, boolean) 배열은 각 항목에 직접 값을 갖고 있지만,                                       참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있다. 
  • 예를 들어 String은 클래스 타입이므로 String[] 배열은 각 항목에 문자열이 아니라, String객체의 주소를 가지고 있다.                   즉, String 객체를 참조하게 된다.
  • 객체를 참조하는 배열은 2차원 배열 형태를 가지고 있다.

                                              → for문을 인덱스를 객체로 놓고 향상된 for문으로도 작성이 가능하다.

 

 

 

5. java.lang.String 클래스

C언어에서는 문자열을 char형 배열로 표현하지만, 자바에서는 문자열을 위한 String이라는 클래스를 별도로 제공한다.

String 클래스에는 문자열과 관련된 작업을 할 때 유용하게 사용할 수 있는 다양한 메소드가 포함되어있다.

이러한 String 클래스는 java.lang 패키지에 포함되어 제공된다.

 

String 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.

이러한 객체를 자바에서는 불변 객체(immutable object)라고 한다.

즉, 자바에서 덧셈(+) 연산자를 이용하여 문자열 결합을 수행하면, 기존 문자열의 내용이 변경되는 것이 아니라 내용이 합쳐진 새로운 String 인스턴스가 생성되는 것이다.

docs.oracle.com/javase/8/docs/api/index.html

 

Java Platform SE 8

 

docs.oracle.com

 

대표적인 String 메소드

String 클래스의 메소드는 매우 다양하며, 그중에서 많이 사용되는 메소드는 다음과 같다.

char charAt(int index)

해당 문자열의 특정 인덱스에 해당하는 문자를 반환함.

int compareTo(String str)

해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교함.

int compareToIgnoreCase(String str) 해당 문자열을 인수로 전달된 문자열과 대소문자를 구분하지 않고 사전 편찬 순으로 비교함.
String concat(String str)

해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환함.

int indexOf(int ch)

int indexOf(String str)

해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환함.

int indexOf(int ch, int fromIndex)

int indexOf(String str, int fromIndex)

해당 문자열에서 특정 문자나 문자열이 전달된 인덱스 이후에 처음으로 등장하는 위치의 인덱스를 반환함.
int lastIndexOf(int ch) 해당 문자열에서 특정 문자가 마지막으로 등장하는 위치의 인덱스를 반환함.
int lastIndexOf(int ch, int fromIndex) 해당 문자열에서 특정 문자가 전달된 인덱스 이후에 마지막으로 등장하는 위치의 인덱스를 반환함.
String[] split(String regex) 해당 문자열을 전달된 정규 표현식(regular expression)에 따라 나눠서 반환함.
String substring(int beginIndex) 해당 문자열의 전달된 인덱스부터 끝까지를 새로운 문자열로 반환함.
String substring(int begin, int end) 해당 문자열의 전달된 시작 인덱스부터 마지막 인덱스까지를 새로운 문자열로 반환함.
String toLowerCase() 해당 문자열의 모든 문자를 소문자로 변환함.
String toUpperCase() 해당 문자열의 모든 문자를 대문자로 변환함.
String trim() 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거함.
length() 해당 문자열의 길이를 반환함.
isEmpty() 해당 문자열의 길이가 0이면 true를 반환하고, 아니면 false를 반환함.

 

 

 

 

6. 상속

▷p288

 

6-1. 두개의 클래스를 사용하는 방법 2가지

1) 클래스를 객체 변수 (인스턴스)로 사용하기 - has ~ a 부속/연관 관계

      class A{

      }

      class B{

             A a;

      }

 

 

      사원에 대한 객체

 

      사원{

                    사원정보

                     - 이사만의 정보

                     - 정직원만의 정보

                     - 계약직만의 정보

      }

      이사, 정직원, 계약직

 

 

 

2) 클래스를 상속 - is ~ a 대등 관계

 

  • 이미잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다.
  • 상속을 해도 부모 클래스의 모든 필드와 메소드들을 물려받는 것은 아니다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
  • 클래스명 뒤에 extends 뒤에 기술한다.
  • 다른언어와는 달리 자바는 다중 상속을 허용하지 않는다.

상속을 이 그림과 같이 생각하면 된다.

                                              

두가지는 다른 개념이다.

 

 

 

 

6-2. Object 클래스 

▷p457

  • 모든것의 최고 조상은 Object 클래스이다.
  • 상속받지 않으면 최소한 Object는 상속받는다.
  • 필드가 필요없고, 메소드들로 구성되어있다.
  • 메소드들은 모든 클래스가 Object를 상속하기 때문에 모든 클래스에서 사용이 가능하다.

Object는 최상위 부모 클래스이다.

 

 

 

 

 

6-3. 부모 생성자 호출

▷p292

  • 반드시 부모생성자 다음에 자식생성자가 호출된다.
  • 자식과 부모의 주소가 같다는 것을 알수 있다.
  • 이는 따로 만들어지는 것이 아니라 상속이 이루어지면 같은곳에 생성되는 것을 의미한다.
  • super(매개값, ...)는 자식 생성자에서 매개값의 타입과 일치하는 부모 생성자를 호출한다.
  • super(매개값, ...)는 this()와 역시 첫줄에 와야한다.
  • super(매개값, ...)이 생략되면 컴파일러에 의해 super()가 자동적으로 추가되기 때문에 부모의 기본생성자가 존재해야 한다.
  • 자식생성자와 부모생성자가  모두 기본 생성자가 아닐 때, 부모생성자를 쓰려면 무조건  super(매개값, ...)를 써줘야 한다.

 

부모, 자식클래스의 주소가 같고 super를 사용하여 매개값이 일치하는 부모 생성자를 호출한다.

 

 

 

 

6-4. 메소드 재정의 (오버라이딩)

▷p295

  • 오버로딩은 한 클래스 내에서 쓰는 것이고, 오버라이딩은 부모- 자식에 쓰는 것이다.
  • 부모에 있는 함수를 자식에서 같은 이름으로 다시 정의하게 되면 자식 것을 실행시킨다.
  • 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야한다.
  • 접근 제한을 더 강하게 오버라이딩 할 수 있다. 
  • 새로운 예외를 throw할 수 없다.
  • 자식 안에서 부모를 부를땐  super.부모메소드(); 를 사용하고, 내가 나를 부를땐 this.메소드();

오버라이딩 되어 자식클래스의 메소드를 실행

 

 

▷p298

super.부모메소드(); 사용하여 오버라이딩처럼 구현

 

            (관련 예제)

 

 

 

 

 

6-5. final 클래스와 final 메소드

  • 쉽게 말해서 마지막으로 처리한다는 뜻이다. 상수화 시키는 것.
  • 클래스를 선언할 때 final 키워드를 class 앞에 붙이게 되면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다.
  • 따라서 클래스와 메소드 선언 시에 final 키워드가 지정되면 상속과 관련이 있다.
  • 메소드를 선언할 때 final 키워드를 붙이게 되면 이 메소드는 최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다.
  • 즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없다는 것이다. 

728x90
Comments