날아라쩡글이의 블로그입니다.

상속 본문

중앙 HTA (2106기) story/java story

상속

날아라쩡글이 2021. 9. 14. 21:51
반응형

배열에 주소값을 담는 경우 방법이 2 가지가 있다. 

  1. new연산자를 이용하여 객체의 주소값을 담는 참조변수를 만들어서 호출하는 방법
  2. 배열의 각 칸에 학생정보를 저장하여 바로 생성자를 입력하여 연결되게 만드는 방법이 있다. 

2번의 방법같은 경우 불필요하게 Student의 변수를 만들지 않아도 된다. 

자바 프로그램의 경우 에러가 날 경우 프로 그램이 아예 중단이 된다. null포인트오류시 if문을 이용하여 if(score != null)을 이용하여 null값이 아닌 것들만 출력이 가능하게 할 수 있다. 나중에는 예외 던지기 방식을 이용하여 회피하는 방법으로 진행될 수 있다. 

객체의 경우 엄청난 데이터로 이뤄지고 있고, 설계되고 사용하기 때문에 객체의 양이 많다. 그렇기 때문에 접근제한자에서 작성한 것처럼 System.out.println("국어:" + student.getScore().getKor());이런 방식의 경우 계속 내용이 추가될 경우가 있기 때문에 ScoreDetail score = student.getScore();     ScoreDetail처럼 주소값을 참조하는 참조변수를 생성하여 System.out.println("국어:" + score.getKor());이런식으로 변수를 작성해서 작성 해주는 것이 좋다. 

java에서 null값의 경우 모든 참조변수는 타입에 상관없이 null값을 가질 수 있다. null 의 뜻은 참조하는 객체가 없다는 뜻이다. 

AtomicInterger (숫자) : 지정된 숫자부터 시작하는 자동으로 번호를 부여해주는 프로그래밍 옆에 적은 번호부터 뽑아서 주는 값이다. 자동으로 업데이트 되는 숫자를 제공하는 객체이다. getAndIncrement()메소드의 경우 AtomicInterger(숫자)값에서 번호를 주고 증가함. getIncrementAnd()메소드는 번호 증가후 번호를 줌. getAndDecrement();메소드의 경우 숫자를 -1로 번호를 매기는 숫자이다. 

Scanner 의 경우 기존의 입력값은 보존되지 않으며, main method가 종료될 때 자료가 사라진다. 

  • int position = 0;
  • Student[] student = new Student[100]; //배열을 담을 참조변수를 생성한다.
  • students[position++] = new Student(atomic.getAndIncrement(),3,"김똥삥",new ScoreDetail(100,90,80));
    students[position++] = new Student(atomic.getAndIncrement(),2,"이순대",new ScoreDetail(10,80,75));
    students[position++] = new Student(atomic.getAndIncrement(),1,"홍길동",new ScoreDetail(60,50,20));
    students[position++] = new Student(atomic.getAndIncrement(),4,"앙버터",new ScoreDetail(40,70,60)); 
  • 생성자메소드를 이용하여 입력을 해준다. 이렇게 하면 새롭게 입력을 하지 않고 자료가 있는 상태로 Scanner을 이용할 수 있다. 
  • ScoreDetail score = new ScoreDetail(kor, eng, math);
    Student student = new Student(no, grade, name, score);이렇게 생성자 메소드를 이용하여 score의 값을 포함관계로 만들어 줄 수 있다. 

Stack영역은 선입선출의 형태로 쌓인다고 작성한적이 있다. main메소드가 먼저 작성되었기 때문에 main method가 종료시 stack영역에서는 사라진다. 입력한 정보가 저장될 방법은 두가지가 있다. 1. 파일(엑셀)을 만들어서 저장하는 방법, 2. DateBase를 이용하여 기록매체로 남아있게 하는 방법이다. File을 만들어서 보관하는 방법의 경우는 실시간 공유가 되지않고, 데이터 양이 많으면 찾기 어렵고, 수정 후 상대방에게 다시 전달하게 될 경우 상대방이 읽지 않으면 수정 데이터를 이용할 수 없고, 서로 갖고 있는 데이터가 달라져 버린다는 것이 문제가 된다. 데이타 베이스의 경우 1. 실시간 공유 2.실시간 업데이트가 됨, 3. 특정 원하는 검색방법으로 검색이 됨. 4. 데이터가 동기화되어 유지가 쉽다는 장점이 있다. 데이터베이스는 IP주소만 입력하여 로그인을 하면 누구든지 접근이 가능하다는 이점이 있다. SQL이라는 언어를 이용하여 실시간으로 데이터 조회, 추적, 수정이 가능하다. AtomicInterger(숫자); 처럼 DB Auto가 자동부여되여 일련번호 발급기로 번호를 획득할 수 있는 장점이 있다.

프로그래밍을 하기 전 요구사항과 방법을 정의해야한다. 

  • 요구사항
    1. - 학생정보, 성적정보를 조회할 수 있다.
    2. - 신규 학생정보, 성적정보를 입력할 수 있다.
    3. - 등록된 학생의 성적정보를 수정할 수 있다.
    4. - 등록된 학생정보, 성적정보를 삭제할 수 있다.
    5. - 프로그램을 종료할 수 있다.

  • 개발하기
  • 1. 프로그램의 대상이 되는 데이터 표현하기
    • - 프로그램의 대상이 되는 데이터는 무엇인가?
      • 학생정보, 성적정보
    • - 프로그램의 대상이 되는 데이터를 표현하는 클래스를 정의한다.
      • Student, ScoreDeatil
    • - 클래스들 간의 관계는 무엇인가?
      • Student has a ScoreDetail
  • 2. 프로그램 설계하기
    • - 학생정보는 어디에 저장하는가?
      Student[] students = new Student[100]
      • * 여러 개의 학생정보를 관리해야 함으로 배열객체를 생성한다.
      • * 학생정보는 students 배열에 0번째 부터 순서대로 저장한다.
    • - 학생정보의 저장위치는 어떻게 관리하는가?
      • int position = 0;
      • * 배열에서 신규 학생정보의 저장위치를 position 변수에 유지하고,
                          학생정보를 저장하고 나면 position의 값을 1증가시켜서 배열의 다음 칸에 저장되도록한다.  - 학생정보의 조회/입력/수정/삭제 및 프로그램 종료기능은 어떻게 구현하는가?
      • Scanner scan = new Scanner(System.in)
      • * 각각의 기능을 메뉴로 화면에 출력시키고, Scanner객체를 이용해서 실행할 기능에 대한 메뉴번호를 입력받는다.
      • * if ~ else if ~ else if 문을 사용해서 각각의 메뉴번호에 해당하는 기능들을 구분해서 구현한다.
  • 3. 세부기능 구현하기
    • - 조회기능
      * students배열에 저장된 모든 학생정보와 성적정보를 출력한다.
      * 향상된 for문을 사용해서 students배열에 저장된 Student객체의 주소값을 순서대로 전달받아서
                        해당 주소값이 참조하는 Student객체의 학생정보와 성적정보를 출려가는 기능을 반복 수행한다.
      * 만약, students 배열에서 조회된 주소값이 null이면 더이상 저장된 학생정보가 없는 것으로 보고 반복을 중단한다.
    • - 입력기능
      * 학년, 이름, 국어, 영어, 수학점수를 입력받는다.
      * Student객체와 ScoreDetail 객체를 생성해서 각각 학생정보, 성적정보를 입력하고, ScoreDetail객체를 Student에 연결한다.
      * 학생정보를 students[position]에 저장한다. position은 학생정보를 저장할 위치를 나타내는 변수다.
      * position의 값을 1증가시켜서 다음 저장위치를 지정한다.
    • - 수정기능
      * 수정할 성적정보를 포함하고 있는 학생의 학번, 수정할 과목명, 수정할 점수를 입력받는다.
      * 입력된 학번에 해당하는 학생정보를 조회한다.
      * 학생정보가 존재하면 해당과목의 점수를 수정하고, 학생정보가 존재하지 않으면 오류 메세지를 화면에 표시한다.
    • - 삭제기능
      * 삭제할 학생정보에 대한 학번을 입력받는다.
      * 입력된 학번에 해당하는 학생정보가 배열의 몇 번째에 저장되어 있는지 조회한다.
      * 삭제할 학생번호가 저장된 칸에 배열의 맨 마지막번째 학생정보를 저장하고, 배열의 맨 마지막번째 칸의 값을 null로 변경한다.
      * 신규 학생정보의 저장위치를 가지고 있는 position값을 1감소시킨다.
    • - 종료기능
      * break문을 실행시켜서 while문을 탈출한다.

상속

  • extends라는 키워드로 표현한다. 
  • 기존의 클래스(부모클래스)를 재사용해서 새로운 클래스 (자식클래스)를 작성하는 것이다. 
  • 상속을 이용해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있다. 
  • 새로 작성된 클래스들은 기존 클래스의 코드를 공통으로 가지게 되기 때문에, 공통코드의 관리가 쉬워진다 .
  • 코드의 재사용성을 높일 수 있다. 
  • 코드의 중복을 제거할 수 있다. 
  • 코드의 중복을 제거하기 때문에 프로그램의 생산성과 유지보수성이 좋아진다. 
  •  

부모의 클래스를 이용하여 작성하고 나머지는 본인의 고유한 특성만 작성하면 되기 때문에 전화받기의 기능만 달라진다면 부모요소의 메소드만 수정해주면 되는 것이다. 그렇기 때문에 유지보수가 높아지고, 부모를 상속받고 고유한 부분만 코딩하면 되는 부분이라 빠르게 개발이 가능하고, 생산성이 높아진다. 

위에서 아래로 내려보내는 것을 상속이라고 한다. 상속의 주체는 부모라고 생각할 수 있는데 (일반적인 경우가 상속의 주체는 부모기 때문에 그렇게 생각할 수 있다.) 그러나 프로그래밍에서는 상속의 주체는 자식에게 있다. 프로그램의 자식이 누구에게 상속받을지, 자식이 결정하고 부모는 누가 받았는지 알수 가없다. 자식에 대한 정보가 없어서 필요한 자식이 상속을 받아간다. 

상속은 확장한다고 생각하면 편하다. 

public class Iphone12 extends SmartPhone(SmartPhone을 확장해서 Iphone12을 만들었다. )

publid class Galaxy10S extends SmartPhone(SmartPhne을 확장해서 Galaxy10S을 만들었다.)라는 식으로 확장하다라는 말로 번역하면 편하다. 부모를 확장해서 만들었기 때문에 모든기능을 가지고 있다. 기능을 선택적으로 가져갈 수는 없다. 

상속관계에 있는 객체의 생성

  • 하위 객체를 생성하면 상위객체도 같이 생성된다. 
  • 하위 객체는 상속받은 상위객체를 포함하고 있다. 
  • 하위 객체를 참조하는 참조변수로 하위 객체의 변수와 메소드를 사용할 수 있다. 
  • 하위 객체를 참조하는 참조변수로 하위 객체 내부에 포함되어 있는 상위 객체의 변수와 메소드를 사용할 수 있다. 
  • 단, 상위객체의 생성자 메소드와 상위 객체의 은닉화(숨겨진)된 변수나 은닉화된 메소드는 사용할 수 없다
  • 동일한 상위 클래스를 상속받은 하위 클래스는 객체를 생성하면 모두 상위 객체를 내부에 포함하게 된다. 
  •  
    Object는 모든 객체의 최상위의 부모이다. 그림의 경우 new생성자를 이용하여 객체를 생성하고 객체의 참조변수로 연결될 수 있도록 만들었는데, 객체를 생성할 때 모든 조상의 객체가 생성이 된다는 것이다. 객체를 하나 더 생성하면 같은 모습의 객체가 하나 더 생성이된다.
  • this의 경우 자신의 주소값을 갖고 있는 변수였다. Super의 경우 자신의 부모에 대한 주소값을 가지고 있는 객체로, 그렇기 때문에 항상 상위의 객체를 포함하고 있다고 생각하면된다. 메소드의 기능을 확인해보면 오른쪽에 나와있는 class의 이름이 조상객체의 클래스 이름을 표현해주는데 자신의 부모가 누구인지는 안다는 뜻이지만, 자식이 몇개인지는 부모로써 변수 참조값을 만들기 어렵기 때문에 부모는 자식의 수를 파악하기 어렵다.

언제 상속을 사용해도 될까?

  1. A, B, C클래스에 공통으로 등장하는 속성(변수) 혹은 기능이 있을때
    • parent의 클래스를 만들어서 공통속성, 공통의 기능을 정의하고, A, B, C는 Parent를 상속받아서 클래스를 정의하는 것이다. 
    • A, B, C에는 자신의 고유한 속성과 고유한 기능만을 구현한다. 
    • 이점 : Parent 클래스를 재사용할 수 있다. A, B, C를 빠르게 구현할 수 있다. 코드의 중복이 제거된다. 코드의 유지보수성이 높아진다. 
  2. A, B, C클래스를 같은 종류의 클래스로 만들어야 할 때 (구현) ---중요한 이유이다.
    • 개, 사람, 소, 고양이는 개별적이지만 한가지로 만들고 싶을 때는 포유류로 만들 수 있다. Parent 클래스를 만들어서 A, B, C는 Parent를 상속받아서 클래스를 정의한다. A, B, C는 이제 Parent류 클래스가 되었다. 
    • 클래스 형변환이 가능하다. 
    • parent라는 하나의 타입으로 A, B, C를 관리할 수 있다. 
  3. A, B, C클래스가 Parent처럼 되고 싶을 때 
    • 웹서버에서는 크롬과 엣지, 사파리 (클라이언트 서버)에 요청을 보내고 클라이언트 서버에서는 응답을 보낸다. 클릭하면 요청마다 다 다른 응답을 주지만, HTTP servelt서블릿으로 서버에서 작동하는 작은 서버를 요청과 응답처리 할 수 있기 때문에 이것을 상속받아서 사용하도록 만드는 것이다. 
    • 부모의 BackGround를 사용하고 싶을 때, 부모랑 똑같이 되고 싶을 때 사용을 한다. 
    • Parent클래스가 기본적으로 제공하는 기능을 사용할 수 있게 됨으로써 A, B, C도 Parent와 같은 역활을 담당할 수 있게 되었다. 

클래스의 상속

  • 단일 상속만 지원한다. 
  • 하위클래스는 한개의 상위 클래스만 상속 받을 수 있다. 
  • 두 개 이상의 상위 클래스를 동시에 상속 받을 수 없다. 
  • 동시에 상위클래스를 두 개 상속받을 수는 없지만, 여러 상위 클래스를 수직적으로 상속받을 수는 있다. 

상위 클래스가 지정되지 않은 클래스는 항상 Object클래스를 상속받는다

  • Object클래스는 자바의 최상위 클래스다. 
  • Object클래스는 배열을 포함한 모든 클래스의 최상위 클래스다. 
  • 따라서 , 자바의 모든 클래스는 Object클래스의 하위 클래스다
  • Object클래스는 java.lang패키지에 있다
  • Object클래스는 상위 클래스가 없는 유일한 클래스다. 
  • Object클래스에는 배열을 포함한 모든 객체가 꼭 포함해야할 메소드가 정의되어 있다. 
  • 배열객체를 포함한 모든 객체는 Object객체를 내부에 포함하고 있다. 
  • 배열객체를 포함한 모든 객체는 Object객체가 가진 기능을 사용할 수 있다. 
  • Java.lang에서 native의 경우 자바로 구현 못 하는 걸 C++과 C로 구현되어있고, 호출할 수 있다는 것을 의미한다. 

자바도큐먼트 주석

  • /**와 엔터를 치면 자바 도큐먼트주석이 생성된다. 
  • 우리가 적어놓은 글들에 대해서 Html파일로 만들수 있는 것으로 
  • project ->export ->Java doc ->next ->next -> Vmoptions -encoding UTF-8로 제목, finish ->yes to all 
  • //:C ->workspace ->oop2 ->index ->html 
  • export에 대한 javadoc.exe를 이클립스에서 사용한 것이다. 
  •  

이렇게 생성할 수 있다. 

 

has a 포함관계는 생성자를 작성하고 참조변수를 이용하여 작성하여 사용할 수 있고, 

is a 상속관계는 생성자가 필요없이 바로 사용할 수 있는 조립까지 끝나있어서 JVM이 자동으로 만들어주는 것을 의미한다. 

반응형

'중앙 HTA (2106기) story > java story' 카테고리의 다른 글

클래스의 형변환  (0) 2021.09.17
메소드 재정의 (Overriding)  (0) 2021.09.16
접근제한자 (modifier)  (0) 2021.09.13
Static , 정적메소드, 정적변수  (0) 2021.09.12
생성자 (constructor)  (0) 2021.09.09
Comments