Study/코드프레소 java 웹개발 체험단

[JAVA프로그래밍 초급]2주차: 객체지향

공부하기 좋은 날 2022. 1. 25. 14:34

코드프레소 java웹개발 체험단 2주차의 자바 강의 내용은 객체지향에 관한 것이였다. 객체지향에 관한 것은 1학년2학기 때 학교 강의에서 배웠던것이라 기억속에 있던 것인데 강의를 들으며 그때 배운 개념을 복습할 수 있었으며 더욱 구체적이고 정밀하게 상기할 수 있었다. 1학년때 배운것을 4학년에 한번 더 복습해보니까 기존에 하던 것들에 적용하며 더욱 실감나게 복습할수있었다. 특히 저번학기 유니티 개발에서 다형성 등 실무에 적용할때 따로 공부하고 싶던 부분이 있었는데 더욱 자세히 알게되어 이해가 잘 되었다. 개념을 설명, 요점 정리, 실습까지 해보니까 이해가 쏙쏙 되는 강의였다. 강의 내용을 정리해보았다.

 

1. 객체지향 기초 개념

소프트웨어 개발방법론

: 소프트웨어는 복잡하고 거대해지며 요구사항대로 동작하는 소프트웨어를 정해진 기간과 예산 안에 만드는것이 어렵기때문에 소프트웨어 개발 방법론이 나타남

 

- 소프트웨어 개발 방법론은 요구사항 수집, 분석, 고수준설계, 상세설계, 구현, 테스트의 절차를 거치며

구조적 방법론, 정보공학 방법론. 객체지향, 컴포넌트, 애자일 방법이 있다.

 

- 그 중 객체지향은 각자의 객체가 메시지를 주고받으며, 책임을 갖는 객체를 중심으로 소프트웨어를 개발하는 것.

 

예를들어, 3명의 직원이 있을 때 각자 시간이 나는대로 일을 처리한다면 사장의 지시가 없다면 혼란스럽겠지만, 각 객체에 역할을 부여한다면 각자의 역할만 잘 이해하고 학습하면 됨.

 

이처럼 소프트웨어의 (객체지향, 절차지향 등 선택)설계를 통해 효율이 달라질 수 있음.

 

절차지향: 행위에 집중

ex) 강의 수강 기능을 하는 함수를 설계하고 구현

객체지향: 객체의 역할에 집중

ex) 강사객체는 어떠한 속성과 기능을 갖는가?

 

 

2. 추상화와 클래스 설계

- 자바는 객체지향 언어

- 객체는 사물

- 클래스는 객체를 생성

객체와 클래스에 대한 설명(출처: 코드프레소)

 

- 추상화

: 반드시 필요한 것을 선택하고, 불필요한것을 버리는 과정

추상화 과정 자체가 하나의 클래스를 설계하는 과정이며 그 클래스에는 속성( 멤버 변수) 와 행위(멤버 함수)가 들어감.

 

이러닝 시스템 추상화하여 클래스 만들기(출처:코드프레소)

좋은 클래스는 꼭 필요한 최소한의 속성과 행위만 있으며 속성과 객체 사이에 높은 관련이 있어야 한다.

 

- 클래스 설계

클래스의 구조와 객체의 생성(출처:코드프레소)

객체를 생성할때는 클래스 참조 변수새 객체를 생성하여 참조 정보를 저장

 

객체의 멤버변수 접근하기(출처: 코드프레소)
클래스 요약(출처:코드프레소)

 

 

3. 메소드의 개념과 기초 활용

함수와 메소드의 개념(출처: 코드프레소)
메소드의 문법과 특징(출처: 코드프레소)

메소드와 함수는 비슷해보이지만 다른것이다.

 

 

4. 접근 제어자의 개념 및 적용

1) 캡슐화

: 객체의 속성과 행동을 하나의 단위로 그룹화

객체의 속성과 행동을 은닉

= 반드시 필요한 것만 외부에 노출하는것

 

2) 정보 은닉

객체 내부에는 외부에서 접근하여 변경하면 안되는 속성이 존재함

맘대로 바꾸기 못하기 위해 접근 제어자(public, private, protected. default)를 사용하여 정보은닉을 한다.

 

 

캡슐화와 정보은닉(출처: 코드프레소)

 

5. 메소드의 리턴값과 파라미터

메소드의 파라미터 = 함수의 매개변수와 같음

 

[this키워드]

객체 내부에서의 this는 해당 객체 자신을 의미하며 set함수를 이용하여 this의 private 멤버변수를 설정한다.

 

void SetAge(int age){

     this.age=age; }

 

this 키워드의 개념과 활용(출처: 코드프레소)

- 인자와 파라미터: 인자는 메소드에 전달하는 데이터(값)이며, 파라미터는 전달받는 인자 값을 저장하는 변수이다.

 

- 메소드 리턴값의 활용: 메소드에 리턴타입을 명시하고 return키워드를 사용해 값을 넘김

get함수를 호출하여 this의 private 멤버변수를 리턴한다.

 

void GetAge(){

     return this.age; }

 

메소드의 리턴값과 파라미터 요약(출처: 코드프레소)

 

 

6. 생성자

객체가 생성되는 시점에 호출되는 특별한 메소드. 초기화를 위해 사용

생성자 특징(출처: 코드프레소)

 

7. 메소드 오버로딩

- 서로 다른 파라미터, 같은 이름의 메소드를 한 클래스 안에서 사용하는 것

- 의미있는 메소드의 이름을 여러 메소드에 사용 가능

- 메소드 호출 시 세팅하는 파라미터에 따라 어떤 메소드가 호출될지 결정됨

- 리턴 타입은 메소드 오버로딩의 조건 x

- 생성자도 오버로딩 가능

 

 

8. 상속

부모 클래스의 속성과 기능을 상속받는것

자바는 다중 상속 안됨, 단일 상속만 허용

자바의 상속 키워드 : extends

자바의 상속(출처: 코드프레소)

상속관계에서 부모의 protected멤버는 자식클래스에서 접근 가능하다.

 

하지만 private멤버는 자식클래스에서도 접근 불가능하다.

 

자식클래스에서 접근 제한을 위해서는 protected, 접근 허용을 위해서는 private멤버를 사용한다.

 

 

[상속관계에서의 생성자]

- 부모 클래스의 생성자는 상속시 상속되지 않는다.

- 자식 클래스의 객체를 생성 시, 부모 클래스의 기본 생성자를 자동으로 호출

 

[Super키워드]

- 자바에서 super는 부모 클래스를 의미하는 키워드

- super. 으로 부모 클래스의 멤버에 접근이 가능하다. ex) super.name -> 부모 클래스의 name 멤버변수

- 메소드 호출처럼 super(); 를 하면 파라미터가 없는 부모 클래스의 생성자를 호출한다. 명시적으로 호출하지 않을경우 자동으로 호출됨.

- 파라미터가 있는 부모 객체 생성자는 명시적으로 코드에서 호출해주어야한다.

 

[메소드 오버라이딩]

- 부모 클래스로부터 상속받은 메소드를 자식 클래스가 자신만의 특성에 맞게 새롭게 구현하는 것.

- 부모 클래스에 있는 함수와 같은 이름, 같은 파라미터, 같은 리턴타입의 함수를 자식클래스에서 새롭게 구현

- 코드의 간결성을 유지하며 내용 확장 가능

 

 

9. 다형성의 이해

클래스는 사용자 정의 타입=자료형

자바는 기본적으로 서로 다른 타입의 객체를 참조할 수 없는데, 

예외적으로 부모클래스(타입)의 참조 변수는 그 자식타입의 객체를 참조할 수 있다!!!

 

 

부모 클래스의 참조변수가 자식 클래스의 객체를 참조 가능(출처: 코드프레소)

 

부모 클래스의 참조변수가 자식 클래스의 객체를 참조하여 luke가 갖는 멤버는 부모, 자식의 것이 있음(출처:코드프레소)

[다형성]

- 다형성= 다양한 형태를 가지는 성질

- 다형성은 객체지향의 주요 특성 중 하나임

- 동일한 사물이 때에 따라 서로 다른 기능을 하는 것에 비유할 수 있음

 

= 하나의 타입이 때에 따라 여러 종류의 객체의 특성을 가질 수 있는 것

- 여러 종류의 객체를 참조할 수 있는 것-> 같은 형태의 메소드가 때에따라 다양한 역할 수행 가능

-메소드 오버라이딩, 부모 클래스의 참조변수가 자식클래스의 객체를 참조할 수 있다는 두가지 특성으로 다형성 구현이 가능하다.

 

자식 클래스를 참조하고 메소드 오버라이딩을 하여 같은 메소드가 때에 따라 다른 역할을 수행하는 다형성 사용(출처: 코드프레소)

다형성의 장점?

- sw 요구사항 변경이나 추가에 대해 유연한 설계, 요구사항 추가될경우 기존 코드 변경 최소화하며 확장 가능

예시)

자식 클래스를 참조한 user객체가 loginManager에서 각 자식마다의 processLogin메소드를 호출함(출처: 코드프레소)
다형성을 사용하지 않은 로그인 매니저- 유저 타입이 생길때마다 유저타입을 매개변수로 갖는 메소드 코드를 추가해주어야 한다.(출처: 코드프레소)
다형성을 사용한 로그인 매니저-유저 타입이 새로 생길때마다 코드를 추가해 줄 필요가 없고, 매개변수를 user로 받아서 함수 호출 가능(출처: 코드프레소)

 

 

 

* 잠시 c# 복습- 인터페이스

다형성기법에 상속 뿐만 아니라 인터페이스 문법도 있다.

인터페이스는 어떠한 기능의 정의와 구현을 분리한 것으로, 모든 기능을 추상화로 정의만하고 구현하지 않은것을 의미한다.

 

맨 앞에 I를 붙이고 그 뒤에 대문자를 붙여 인터페이스라는것을 알리며 코루틴의 IEnumerator 도 인터페이스이다.

다중상속이 가능하며, 인터페이스에서 구조와 형태를 만들고 실제 클래스에서 정의한것을 구현해주어야 한다.

 

- 예시 인터페이스-IDragHandler

 

-> 드래그 해주는 인터페이스를 만들어놓고
namespace UnityEngine.EventSystems
{
    public interface IDragHandler : IEventSystemHandler   // public 으로만 가능하고 interface키워드를 사용하여 만들며 대문자 I와 그 뒤에 대문자를 사용하여 인터페이스를 정의한다
    {
        void OnDrag(PointerEventData eventData);
    }
}


-> 실제 클래스에서
public class DragClass : MonoBehaviour,IBeginDragHandler, IDragHandler, IEndDragHandler ,IPointerDownHandler
{
...
    public void OnDrag(PointerEventData eventData)
    {
        rectTransform.anchoredPosition += eventData.delta;
    } //  이런식으로 인터페이스에서 만든 함수를 구현
...
}

자바에서도  c#과 같이 인터페이스가 사용된다.

 

10. 패키지

패키지: 관련있는 클래스를 한데 묶어놓은 그룹

 

 

10. 컬렉션 프레임워크

: 다양한 자료구조의 구현을 위한 클래스와 인터페이스의 집합

- 다양한 데이터를 위해서는 자료구조의 구현체가 필요함

ex) 순서가 있는 데이터, 중복되는 데이터 등

- arrayList, HashSet, HashMap 등의 프레임워크가 있음

 

컬렉션 프레임워크의 필요성(출처: 코드프레소)

 

- 자료구조에 저장된 데이터를 다루기 위한 알고리즘 구현체가 필요함-데이터의 조회, 삭제, 추가 등

- 제공되는 클래스에서 데이터를 가공하기 위한 메서드도 제공

컬렉션 프레임워크의 메서드(출처: 코드프레소)

[컬렉션 프레임워크 클래스와 array]

- 데이터 갯수의 동적인 변경 가능

- 오브젝트(객체)만 원소로 가질 수 있음, int등의 primitive데이터는 못가짐

 

[컬렉션 프레임워크 인터페이스들의 상속 관계]

자바 컬렉션 프레임워크 인터페이스들의 상속관계(출처: 코드프레소)
자바 주요 인터페이스 List, Set, Map 특징(출처: 코드프레소)

11. 제네릭

제네릭(generic)이란 ?

데이터의 타입을 일반화한다(generalize)는 것을 의미

 

- 코드프레소 Java 웹 개발 체험단 활동 중
- 코드프레소 [실무자가 알려주는 Git입문]강의 수강 중
- 코드프레소 URL: https://www.codepresso.kr/

 

프리미엄 IT 교육 서비스 - 코드프레소

 

www.codepresso.kr