반응형

목표

자바의 상속에 대해 학습하세요.

 

학습할 것

 

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

 

 


자바 상속의 특징

상속의 개념

상속(Inheritance)이란 물려준다는 의미이다. 어떤 객체가 있을 때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속이라고 한다. 

 

상속의 장점

  • 기존의 작성된 클래스를 재활용할 수 있다.
  • 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않아도 된다.
  • 클래스 간의 계층적 관계를 구성함으로 다형성의 문법적 토대를 마련한다.
  • 하위 클래스에서 상위 클래스의 특성을 포함하고 확장해서 사용할 수 있다. 

자바 상속의 특징

  • 다중 상속을 지원하지 않는다.
  • 상속 횟수에 제한을 두지 않는다.
  • 최상위 클래스는 Object 클래스이다.

이제 코드를 살펴보겠습니다.

 

1. 상속 예제

 

Parent 클래스와 Child 클래스를 생성하고, Child 클래스는 Parent 클래스를 상속받도록 만들어 보았습니다.

상속의 키워드는 extends를 이용해서 상속받고자 하는 클래스를 뒤에 작성해 주시면 됩니다.

 

1. 상속 예제 결과값

위 예제의 결과 값입니다. 

분명 Child 객체만 생성하였는데 Child 생성자만 호출된 게 아니라 Parent 즉 부모 생성자가 먼저 호출된 이후에 Child 생성자가 호출되는 것을 확인하실 수 있습니다. 위와 같은 결과는 아래 super 키워드에서 설명드리도록 하겠습니다.

 

super 키워드

super의 경우 자식클래스가 부모클래스로부터 상속받은 맴버를 사용하고자 할 때 사용됩니다.

사실 저 Child() 생산자에 super() 메소드가 숨겨져있어서 super() 메소드를 이용해서 Parent 클래스의 생성자를 호출하였던 것입니다. 

super()를 명시적으로 작성해 주지 않으면 컴파일 단계에서 자동으로 추가가 되기 때문에 위와 같은 결과가 나올 수 있었습니다.

** super() 메소드는 자식 생정자의 맨 첫 줄에 생성이됨 그 외에는 에러 발생

super() 메소드를 명시적으로 작성해 준 코드입니다. 결과값은 위와 동일합니다.

 

 super() 키워드를 명시적으로 작성한 코드

super 키워드를 이용해서 Parent 클래스의 원하는 생성자로 초기화할 수 있고 Parent 변수에도 접근할 수 있습니다. 

 

 

 

메소드 오버라이딩

상속은 부모의 메소드를 가져다 사용할 수도 있고, 이를 재정의하여 사용할 수도 있습니다.

'메소드 재정의'라고 할 수 있습니다.

 

substract 메소드인 경우는 Parent 클래스에 메소드를 가져다 사용하였지만 add 메소드 경우 오버라이딩하여서 Child 클래스에서 재정의해서 사용하였습니다.

이렇게 부모의 메소드를 가져다가 재정의 해서 사용하는 것을 메소드 오버라이딩이라고 부릅니다. 

@Override는 애노테이션이라고 부르는데 다음 12주차에 공부할 예정입니다.

지금은 부모의 클래스를 오버라이딩할 때 위에 붙여주어서 '저 메소드가 부모의 클래스를 재정의 했구나' 명시적으로 확인 가능하게 해준다고만 생각하고 넘어가셔도 될 것 같습니다.  

- 추가적으로 @Override 메소드를 이용해서 오버라이딩이 된 메소드인지 검증이 가능하다.

 

다이나믹 메소드 디스패치 (Dynamic Method Dispatch)

다이나믹 메소드 디스패치는 크게 두 가지로 나뉩니다..

 

컴파일 타임에 호출할 때 메소드를 알 수 있으면 정적

컴파일 타임이 아닌 런타임에 호출할 메소드를 알 수 있으면 동적이라고 합니다.

 

2. 다이나믹 메소드 디스패치

 

2. 다이나믹 메소드 디스패치 바이트 코드

다형적이지 않은 Code 13, 21, 53 번은 어떤 클래스에 메소드를 사용할지 컴파일 단계에서 알 수 있습니다.

이런 경우를 정적 메소드 디스패치라고 부르고, Code 37번과 같이 실제 사용되는 객체에 대한 정보를 알 수 없을 경우를 동적 메소드 디스패치라고 부릅니다.

동적 메소드 디스패치 경우 컴파일 시점이 아닌 런타임 시점에 어떤 객체의 메소드를 사용할지 결정됩니다. 

 

추상 클래스

추상 클래스는 구체적이지 않은 클래스를 말합니다.

실체 클래스의 공통적인 부분을 추출해 가이드라인을 잡아놓은 추상적인 클래스입니다.

 

추상 클래스 포인트

1. 실체 클래스의 공통적인 부분(변수, 메소드)를 추출해서 선언한 클래스

2. 추상 클래스는 객체를 생성할 수 없다. 아직은 실체성이 벗고 구체적이지 않기 때문에

3. 추상 클래스와 실체 클래스는 상속관계이다. 

4. 하나 이상의 추상 메서드를 포함한다.

 

추상 메서드란

메서드의 선언부만 작성하고 구현부는 미완성인 채로 남겨두는 메소드를 말합니다.

각 구현부는 상속받는 자식 클래스에서 다르게 구현됩니다.

 

코드로 살펴보겠습니다.

추상 클래스는 abstract 키워드를 class 앞에 붙여서 사용합니다.

add() 메소드에 abstract 키워드를 붙여줌으로서 추상 클래스를 상속받는 클래스들에게 add() 메소드 구현을 강제화합니다. 추가적으로 추상 클래스에 일반 메소드도 사용 가능하고 상속받은 클래스에서 구현할 필요도 없습니다.

 

 

추상 클래스를 상속받아서 add()라는 메소드를 재정의 해줘야 합니다. 만약 재정의를 하지 않으면 에러가 발생하게 됩니다.

위에서 설명했듯이 추상 클래스는 객체를 생성할 수 없습니다.

 

final 키워드

final 키워드는 더 이상 수정할 수 없음을 의미합니다.

클래스, 메소드, 변수 모두에서 사용이 가능합니다.

 

 

위 코드의 빨간 줄 표시에서 확인 할 수 있듯이 IDE에서 에러를 보여주고 있습니다.

클래스에 final 키워들 사용하면 상속을 막고, 메소드에 사용하면 오버라이딩을 막고, 변수에 할당하면 변수 값의 재정의를 막습니다.

 

Object 클래스

  • Object 클래스는 자바 모든 클래스의 최상위 클래스이다.
  • 그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서이다.
  • 따로 상속 받지 않더라도 모든 클래스에서 Object 클래스를 상속받기 때분에 Object 클래스의 기본 메서드를 사용할 수 있다.

 

 

 

 

 

 

 

 

참조 

www.tcpschool.com/java/java_inheritance_concept

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

limkydev.tistory.com/188

 

[JAVA] 자바 추상클래스란?

[JAVA] 자바 추상클래스란? 추상클래스 이 글 하나로 박살내자. 추상클래스의 문법적인 특징이나, 객체생성이 되고 안되고 이런 특징들이 중요한게 아닙니다. 도대체 추상클래스가 무엇이고 왜

limkydev.tistory.com

 

 

728x90
반응형
반응형

목표

자바의 Class에 대해 학습하세요.

 

학습할 것

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메서드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

클래스 정의하는 방법

JAVA 클래스(class)를 찾으면 '자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.'

라는 설명을 많이 볼 수 있을 것이다.

내가 읽은 자바 책에서 클래스에 대한 설명도 틀에 비교하여 설명되어 있었다.

나는 이 이라는 단어가 클래스를 잘 설명해준다고 생각한다.

 

클래스객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메서드로 구성된다.

필드는 클래스에 포함된 변수를 의미하고 메서드는 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

 

사람을 클래스로 표현한다고 예를 들어보자

여기서 사람은 객체가 되고, 사람의 상태를 나타내는 필드는 이름, 나이, 키, 몸무게 등이 있을 수 있을 것이고, 행동으로는 '밥을 먹다'가 메서드가 될 것이다. 

 

 

1. class 정의

위의 예시를 이용해서 클래스를 정의해 보았다.

Person이라는 클래스를 정의함으로써 많은 사람들을 만들 수 있는 틀이 준비된 것이다.

 

객체 만드는 방법

우리는 클래스를 이용해서 사람을 만들 수 있는 틀을 만든 것뿐이지 실제 사람을 만든 것은 아니다.

이제 틀을 이용해서 여러 사람을 만들어 보겠다. 

 

2. 객체 생성

실제 사람들을 만들 때는 new라는 키워드를 이용해서 만든다. 

위의 예시는 new라는 키워드를 이용해서 길동과 영수를 만들어보았다.

이제 우리는 길동과 영수를 만들었으니 행동을 시켜보겠다.

 

메서드 정의하는 방법

메서드를 정의하는 방법은 1.class 정의 캡처 이미지에서 public void eat() {} 이 부분이 메서드를 정의 한 곳이다.

public은 접근제어 지시자라는 키워드인데, 아래에서 조금 더 자세히 설명드리도록 하겠다. 지금은 넘어가자

그다음 void 위치에는 반환 타입이 들어가는데, void는 반환 타입이 없다는 뜻을 의미한다.

내가 숫자를 반환하고 싶다면 int, 문자를 반환하고 싶다면 String 등을 작성하면 된다. 

마지막으로 eat는 메서드명을 의미한다. (메서드명은 그 행동을 명확하게 알 수 있게 네이밍 해주는 것이 좋다.)

이제 메서드를 이용해서 행동을 만들어 보았다면 길동이와 영수가 행동할 수 있도록 사용해보도록 하겠다.

 

3.  메서드 사용

new라는 키워드를 사용해서 생성한 gildong, youngsu를 인스턴스라고 부르는데 생성된 인스턴스 점(.) 메서드명을 작성해서 행동을 시킬 수 있다. 

 

그 결과 위와 같다. 그런데 위의 결과를 보고서는 누가 밥을 먹었는지 알 수가 없다. 그래서 누가 밥을 먹었는지 추가해보도록 하겠다.

 

생성자 정의하는 방법, this 키워드 이해하기

생성자객체를 생성할 때 항상 실행되는 것으로, 객체를 초기화해주기 위해 맨 처음 실행되는 메서드이다. 

지금 우리는 생산자라는 것을 작성한 적이 없지만 사용되었다.

무슨 의미이냐면 만약 클래스에 생성자가 하나도 없다면 컴파일러는 컴파일 단계에서 자동으로 디폴트 생성자를 추가해서 사용하게 된다. 만약 하나라도 생성자가 구현되어 있다면 생성하지 않는다.

 

 

디폴트 생성자 확인

위 캡처를 보시면 target 디렉터리 아래에 Person 클래스에 public Person() {} 메서드가 있는 것을 확인할 수 있다.

이게 바로 디폴트 생성자다. 나는 선언한 적이 없지만 컴파일러가 자동으로 내가 아무런 생성자를 작성하지 않았기 때문에 만든 것이다. 

그럼 이제 우리는 생성자를 이용해서 객체에 초기화할 때 이름을 강제화해서 누가 밥을 먹었는지 확인해보도록 하겠다.

 

Person 객체에 생성자 생성

생성자의 규칙은

1. 클래스명과 메서드명이 동일해야 한다.

2. 리턴 타입을 정의하지 않는다.

 

위에 this라는 키워드가 보일 것이다. this와 생성자는 떨어질 수 없는 둘도 없는 친구이다.

this는 참조 변수로 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수이다.

이러한 this 참조 변수는 해당 인스턴스의 주소를 가리키고 있다.

 

 

이제 생성자를 이용해서 name을 넣을 것을 강제화했기 때문에 에러 메시지가 출력되는 것을 확인할 수 있다.

 

4. 생성자를 이용한 이름 초기화 설정

 

캡처4 결과 값

객체를 생성할 때 이름을 넣도록 강제화하였고, 이제 실행하면 위와 같이 누가 밥을 먹었는지 알 수 있게 되었다.

 

  클래스내부 동일패키지 상속받은클래스 이외의 영역
private o x x x
default o o x x
protected o o o x
public o o o o

접근제어 지시자 표이다. 표와 같이 접근제어 지시자를 이용해서 해당 클래스나 메서드들을 접근할 수 있는 범위를 제한할 수 있다.

 

 


 

 

 

참조

wikidocs.net/281

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

www.tcpschool.com/java/java_methodConstructor_this

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

728x90
반응형
반응형

GitHub을 사용하면서 매번 push 할 때마다 로그인하는 게 힘들어서..
찾아보던 중 ssh 설정에 대해서 알게 되었습니다.

 

 

1. cmd 창에 ssh-keygen를 입력해서 ssh키를 생성한다.

   - id_rsa, id_rsa.pub 파일 두개가 생성됩니다. 

   - id_rsa 파일은 private key로 내 컴퓨터에만 저장되어 있고 누구에게도 공유되어서는 안됩니다.

   - id_rsa.pub 파일은 public key로 접속하고자 하는 원격 컴퓨터에 copy해서 저장합니다.

   - id_rsa key를 가지고 있는 사람은 id_rsa.pub key를 가지고 있는 사람의 컴퓨터에 접속할 수 있다는 약속

 

아래부터는 Git Bash를 사용하였습니다. 위 과정도 Git Bash를 사용하셔도 무관합니다.

 

2. cat id_rsa.pub 입력 후 출력되는 key를 복사합니다.(※오차 없이 복사해야 합니다.)

3. GitHub에 들어가셔서 오른쪽에 Settings를 클릭합니다.

 

4. SSH and GPG keys를 클릭 후 New SSH key를 선택합니다.

 

5. 원하는 Title를 작성하시고 2번에서 복사한 key 값을 아래 Key에 붙여 넣고 Add SSH key 버튼을 클릭합니다.

  -  git 원격 조장소에 public key를 저장이 됐습니다.

 

6. Git Repository를 생성 후 SSH 주소를 clone하면 끝!

 

7. 저는 기존에 사용하고 있던 Repository에 SSH인증 추가가 필요해서 GitBash에서 해당 파일 위치로 이동한 후
git config remote.origin.url (ssh 주소) 등록하였습니다.

 

 

참고 

opentutorials.org/module/2676/15433

 

로그인 없이 원격 저장소 이용하기 (Github) - 지옥에서 온 Git

수업소개 여기서는 ssh의 자동 로그인 기능을 통해서 편리하게 git을 사용하는 방법을 배웁니다. 수업

opentutorials.org

728x90
반응형
반응형

목표

자바가 제공하는 제어문을 학습하세요.

 

학습할 것

- 선택문

- 반복문

 


선택문

- if문, switch문

 

if문

어떤 결과 값이 출력될까요?? ㅎㅎ

 

정답은 '숫자가 10 이상입니다.' 입니다~

 

if 문은 명령문 블록의 실행 여부를 결정하는데 사용됩니다.

첫 번째 조건절에서 'num < 5'라는 조건절에 num은 10이기 때문에 건너뛰고, 다음 조건절에서도 9 이상이기 때문에 건너 뛰어서 위의 조건절을 모두 만족하지 않으면 마지막 else 조건절을 실행시키게 됩니다. 

 

switch문 

어떤 결과 값이 출력될까요?? ㅎㅎ

 

정답은 'num은 3입니다.' 

          'num은 4입니다.'

 

swtich 문은 입력 변수 값과 일치하는 입력값이 있다면 해당 case 문 하위의 문장을 실행합니다. 

혹시 'num은 3입니다.'라고 생각하신 분이 계신가요? 

swtich 문은 해당 case 문을 실행한 뒤 break 문이 있어야지 빠져나갑니다.

만약 break 문이 빠져 있다면 다음 case 문을 실행하게 됩니다.

마지막으로 default 같은 경우는 case의 값이 아닌 다른 값이 저장되어 있다면 default 문장을 실행합니다.

 

반복문

- for문, for each문, while문, do while문

- for 문 같은 경우는 반복 횟수가 정해져 있을 때 사용하고, while 문 같은 경우는 반복 횟수가 정해져 있지 않을 때 사용하면 유용합니다.

for문

어떤 결과 값이 출력될까요?? ㅎㅎ

 

정답은 1월부터 12월까지 순서대로 출력하게 됩니다.

 

for 문의 기본 구성은 (초기값; 조건문; 증가치) 로 구성되어 있습니다.

위의 문제를 예로 들면 i가 조건문 12이하 일동안 증가시키며 반복 수행을 합니다.  

 

for each문

for each는 J2SE 5.0부터 추가되었습니다. for each라는 키워드가 따로 있는 것은 아니고 동일한 for 문이지만 사용하는 구조가 조금 다릅니다. 

배열 형태로 저장되어 있는 과일들을 하나씩 출력하는 소스코드입니다.

for each 문인 경우 증감 연산자가 필요하지 않고, 배열 형태의 값을 꺼낼 때 아주 유용할 것 같습니다.

 

while문

위의 for 문과 같이 1월부터 12월까지 순서대로 출력하게 됩니다.

 

while 문은 조건문이 참인 동안 계속해서 안의 내용을 수행하게 됩니다.

조건문이 참인 경우에도 빠져나가고 싶을 경우에는 아래와 같이 break 문을 이용하실 수 있습니다.

while 문에서 break 사용

 

 

while 문에서 continue 사용 

위와 같이 continue을 사용해서 홀수 월만 출력할 수 있습니다.

continue를 만나게 되면 while 문의 맨 처음 조건문으로 돌아가게 됩니다.

 

do while문

일반적으로 while 문은 조건식이 참일 경우 코드가 실행되는 반면에, do while 문은 무조건 한번 이상 실행하게 됩니다.

 


과제 (옵션)

과제 0. JUnit 5 학습하세요.

과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.

  •  깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
  •  참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
  •  Github 자바 라이브러리를 사용하면 편리합니다.
  •  깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수  있습니다.

 

아직 많이 부족하지만 java api 문서 읽는 방법을 조금이나마 학습할 수 있는 시간이었습니다. 

GitHub API를 이용해서 과제를 진행하다 보니 보다 즐겁게 할 수 있었습니다.

 

과제 2. LinkedList를 구현하세요.

과제 3. Stack을 구현하세요.

과제 4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.

과제 5. Queue를 구현하세요.

 

모든 과제를 수행하지 못했습니다... 꼭 작성하자..

 

728x90
반응형

+ Recent posts