쉽게 배우는 자바 2~7

kdew0308·2022년 10월 26일
0

자바

목록 보기
4/8

1) 변수와 데이터 타입

1-1) 변수란

  • 컴퓨터는 어떤 값을 연산하는 행위를 한 결과값을 저장하고 이를 이용해야 함. 이 때 사용되는 저장과 참조를 위해 할당된 메모리 공간을 변수라고 함
    • 선언 : 변수를 컴파일러에게 알려주는 것
    • 초기화 : 변수를 사용하기 위해 공간에 특정 값으로 할당해주는 것

1-2) 변수의 선언과 초기화

1-3) 상수와 리터럴

  • 상수 : 한번 선언과 초기화를 하면 재정의 할 수 없는 값
  • 리터럴 : 어떤 변수에 선언되는 값, 데이터 그 자체

1-4) 입력과 출력

  • 입력 방법
    • 실행 시 Argument로 넘겨 받는 방법
    • 실행 시 키보드로 입력
  • 출력 방법
    • print(data):data만 출력
    • printf(“형식”,data): 형식에 맞춰 data 출력
    • println(data):data를 출력하고 다음 행으로 이동

1-5) 데이터 타입

정수형

  • 숫자 표현 중 소수를 포함하지 않는 데이터 타입
    byte, short, int, long
  • 주로 int형을 많이 사용하며, 이진 데이터를 다룰때는 byte를 많이 사용

실수형

  • 숫자 표현 중 소수를 포함하는 데이터 타입(부동소수점) 방식
    float, double
  • 정수형과 저장방식이 다르기 때문에 같은 크기라도 큰 값을 표현가능
    • 데이터 표현 범위를 크게 하여 정밀도를 높임

문자형

  • 문자를 저장하는데 사용되며, 변수 하나에 하나의 문자만 저장
    char
  • Java에서 유니코드(2byte) 문자 체계를 사용

논리

  • true, false 중 하나의 값을 사용하며, 조건식과 논리 계산식에 사용
    boolean
  • boolean은 ture와 false 두 값만 표현하면 되기에 1바이트로 가능

1-6) 형변환

  • 서로 다른 타입 간의 연산을 수행하는 경우가 프로그래밍을 하다 보면 존재함 이때, 연산 수행 전 두값의 타입을 일치시켜야 하는데, 변수나 리터럴의 타입을 변환하는 작업을 형변환 혹은 타입변환이라고 함
    Int <-> char
    Double <-> int

자동 형변환

  • 경우에 따라 소스 코드상에서는 형변환을 안해도 컴파일러가 형변환을 추가하는 경우가 있음 이를 자동 형변환 이라고 함
  • 표현 범위가 좁은 범위에서 넓은 범위로 저장될 때, 자동 형변환이 됨
    byte<short<int<long<float<double

2) 연산자

연산자란

  • 프로그램에서 계산을 하기 위해 수행되는 기호를 뜻함
    • 연산의 대상이 되는 피연산자와 연산자의 조합
      -연산자는 수행되는 항에 따라서, 연산 기능에 따라서 종류가 나뉨
      항에 따른 분류 : 단항 / 이항 / 삼항
      기능에 따른 분류 : 산술 / 논리 / 비트 / 관계(비교) / 기타

산술 연산자

  • 산술(수학)적인 연산에 사용되는 연산자
  • 피연산자가 정수형인 경우, 나누는 수가 0이면 에러 발생
  • 연산에 따라 결과값에서 값 손실이 발생할 수 있음

비트 연산자

  • 비트 단위로 논리 연산을 수행하는 연산자
    &, ^, |, ~, <<, >>
    • 비트 연산 : &(AND), |(OR), ^(XOR)
    • 비트 이동 : << (비트 왼쪽으로 이동), >>(비트 오른쪽으로 이동)
    • 비트 전환 : 0비트는 1비트로, 1비트는 0비트로 전환

관계(비교) 연산자

  • 두 피연산자를 비교하는데 사용되는 연산자
    <, >, <=, >=, ==, !=
  • 주로 조건문과 반복문에서 많이 사용하며, 결과는 true/false
    • 대소 비교 연산자
      <, >, <=, >=
    • 등가 비교 연산자
      ==, !=

논리 연산자

  • 둘 이상의 조건을 이용하여 하나의 식으로 만드는 연산자
  • 논리 연산자는 앞의 연산자 중 조건 연산을 사용한 조건을 연결
    • ||(OR 결합) : 피연산자 중 어느 한 쪽만 true이면 true
    • &&(AND 결합) : 피연산자 중 모두 true이면 true
    • !(부정) : 피연산자가 결과를 반대로 반환

기타 연산자

  • 조건 연산자
    • 특정 조건에 부합하는지 검사 후, 참 혹은 거짓에 해당하는 값을 반환
    • 삼항 연산자에서 많이 사용
  • Instanceof : 참조 변수의 타입이 같은지를 비교
  • 대입 연산자
    • 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용
    • 값을 저장하는 대입 연산자와 연산 후 저장하는 복합 연산자(op=)가 존재

항의 수에 따른 연산자

  • 단항 연산자 : 증감 연산자(++, --) / 논리 부정 연산자(!) / 비트 전환 연산자(~)
  • 이항 연산자 : 앞에서 배운 대부분 연산에 적용됨
  • 삼항 연산자 : (조건문) ? (참인 경우 값) : (거짓인 경우 값)

연산자 우선순위

  • 연산자가 두 개 이상인 경우, 우선순위에 따라 적용
  • 산술 연산자의 경우, 우리가 아는 순서로 적용

3) 조건문과 반복문

3-1) 조건문(Condition Statement)

  • 원하는 결과를 얻기 위해 조건을 통해 흐름을 제어하는 구문
  • 조건식에 따라 수행되는 동작을 제어
    • 관계(비교)연산자, 논리연산자가 주로 사용됨
  • if문, if-else문, if-elseif-else문, switch문으로 나뉨

if문

  • if문 다이어그램

if-else문

  • if-else문 다이어그램

If-else if-else

  • If-else if-else 다이어그램

switch문

  • switch 다이어그램

3-2) 반복문

  • 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문
  • while문, do-while문, for문, Enhancedfor문으로 나뉨

while문

do-while문

for문

Enhancedfor

3-3) 기타 제어문

Break문

  • 자신이 포함된 가장 가까운 반복문을 빠져나가는 제어문
  • 보통 조건문과 같이 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 할 때 사용

continue문

-반복이 수행되는 경우, continue문을 만나면 반복문의 끝으로 이동

  • 특정 조건에 만족하는 경우, 연산이 실행되지 않도록 하는 구문

Labeled Loop문

  • 반복문에 이름을 붙여 사용하는 제어문
  • 중첩된 반복문에서 특정 Label을 붙인 반복문으로 cotinue문 혹은 break문이 수행될 수 있음

4) 배열

  • 같은 데이터 타입의 변수들이 하나의 집합 형태로 이루어진 자료구조
  • 배열은 index와 element로 구성
  • Array는 java에서 지원해주는 기본 클래스

4-1) 배열의 구조

4-2) 1차원 배열

  • 가장 기본적인 형태의 고정된 길이를 가진 배열
  • 같은 데이터 타입의 변수들이 집합의 형태를 이루고 있음
  • 데이터 타입은 기본 타입과 참조 타입 모두 올 수 있음
  • 선언
  • 초기화


    -활용

4-3) 2차원 배열

  • 2차원 배열이란 배열의 요소로 1차원 배열을 가지는 배열
  • 선언
  • 초기화

4-4) 가변 배열

  • 2차원 배열 중 각 행마다 다른 길이를 갖는 배열
  • 사용 안하는 공간을 선언할 수 있기 때문에 메모리 효율적으로 관리 가능

4-5) 배열의 활용

Enhanced for문

  • 요소를 변경하는 경우에는 적합하지 않음

배열의 복사

과제 1

  • 반복문을 이용해서 구구단 출력
    • 1~9단
  • 반복문을 이용해서 구구단 중 홀수 단 출력
    • 1~9단
    • Enhanced for문 사용

5) 클래스와 객체

5-1) 객체지향 프로그래밍(OOP)이란?

  • 문제 혹은 로직을 객체 단위로 나눠서 작성하는 방법
    • 절차지향 프로그래밍과 반대의 개념이 아님
  • 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론
    • Java, C# 등이 대표적인 객체지향 프로그래밍 언어
      ex) 자동차(객체) = 데이터(바퀴, 핸들, 차체 등) + 기능(주행보조기능, 길찾기)

5-2) OOP 특징

  • 캡슐화 : 데이터의 구조와 기능을 하나의 캡슐형태로 만들어 외부에서는 형태를 알 수 없도록 하는 방법
  • 추상화 : 객체의 공통적인 필드와 기능을 하나의 형태로 정의하는 설계 방법
  • 상속 : 하위 클래스에서는 상속 받은 상위 클래스의 기능을 사용할 수도 있고, 하위 클래스 자체에 새로운 기능을 추가할 수 있는 것
  • 다형성 : 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 형태로 재구성되는 것(오버로딩/오버라이딩)

OOP 장점

  • 코드의 재사용성 증가
  • 생산성 향상
  • 유지보수 쉬움

OOP 단점

  • 개발 속도가 느림
  • 실행 속도가 느림
  • 코드의 난이도 상승

5-2) 클래스와 객체

  • 클래스 정의
    • 객체의 설계도
    • 사용자 정의 타입
    • 데이터와 기능의 결합
  • 클래스 용도
    • 객체를 생성하는 용도
  • 객체 정의
    • 클래스의 정의된 내용에 맞춰 메모리에 생성된 형태
  • 객체 용도
    • 정의한 클래스 내용에 따라 속성과 기능이 다름
  • 인스턴스화

클래스 변수와 인스턴스 변수

5-3) 변수 초기화

  • 변수를 선언하고 최초로 값을 지정하는 것
    • 멤버변수(클래스 변수, 인스턴스 변수)는 초기화 생략 가능
    • 지역 변수는 반드시 초기화 해줘야 함
  • 멤버변수 초기화 방법
    • 명시적 초기화
    • 초기화 블록
    • 생성자

5-4) 생성자

  • new키워드로 인스턴스를 생성할 때, 제일 먼저 실행되는 메소드
    • 클래스의 이름과 동일한 이름이어야 함
    • 반환 값은 없지만 void형으로 적어주면 안됨
    • 기본 생성자 외에 여러 개의 생성자를 가질 수 있음

기본 생성자

  • 매개변수가 없고, 어떤 실행문도 없는 생성자
    • 모든 클래스에는 반드시 하나 이상의 생성자가 정의
    • Java complier가 어떤 생성자도 없을 때 기본적으로 추가해줌
    • 어떤 생성자가 있으면, complier가 기본 생성자는 별도로 추가하지 않음

매개변수가 있는 생성자

  • 메서드처럼 매개변수를 인자로 받아 인스턴스 초기화에 값을 사용할 수 있는 생성자
    • 인스턴스 생성 후, set메소드를 호출해주는 것보다 간결한 코드

this()와 this키워드

  • this()
    • 같은 클래스 내부의 다른 생성자를 호출할 때 사용
    • 생성자 첫 문장에서만 가능
  • this
    • 인스턴스 자신을 가르키는 참조변수
    • 인스턴스의 주소가 저장, 숨겨진 채로 존재
    • static 메서드에서는 사용 불가

5-5) 메소드

  • 어떤 특정한 기능을 수행하기 위한 명령문들의 집합체
    • 선언부
    • 구현부

구성요소(선언부)

  • 접근제어자, static/final keyword, 메소드 이름, 매개변수 선언, 반환타입으로 구성

구성요소(구현부)

  • 지역변수, 수행될 실행문, return 문으로 구성
  • void형일 경우 return문이 없음

매개변수의 종류

  • 기본형 매개변수 : 기본 데이터형으로 넘겨 받는 매개변수, 읽기만 가능
  • 참조형 매개변수 : 객체로 구성되어있어서 인스턴스의 주소를 넘겨 받는 매개변수, 읽고 변경 가능

반환값의 종류

  • 기본형 반환 값 : 기본형을 반환하는 것은 기본형 데이터를 반환
  • 참조형 반환 값 : 참조형을 반환한다는 뜻은 객체의 주소를 반환

JVM구조

  • Method Area : 클래스 정보와 클래스 변수가 저장되는 공간
  • Stack : 메소드의 작업 공간
  • Heap : 인스턴스가 생성되는 공간

호출 스택

  • 메소드의 작업에 필요한 메모리 공간 제공
    • 메소드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용
    • 메소드가 작업을 마치면 할당되었던 메모리는 반환
    • 호출 스택 제일 상위에 위치하는 메소드가 현재 실행 중인 메소드, 나머지는 대기
    • 객체를 생성하지 않고 호출하기 위해서는 static keyword

static/인스턴스 메서드

  • static 메서드
    • 객체 생성 없이 호출할 수 있는 메서드(Class이름,method이름())
    • 메서드 내 인스턴스 변수 사용 불가
  • 인스턴스 메서드
    • 객체 생성 후, 호출할 수 있는 메서드(참조변수.method이름())
    • 메서드 내 인스턴스 변수 사용 가능

5-6) 오버로딩

  • 한 클래스에 같은 메소드 이름으로 여러 메소드를 정의하는 것
    • 메소드의 매개변수의 수 혹은 타입이 달라야 함
    • 반환 타입은 상관없음

오버로딩과 가변인자

  • 메소드의 매개변수를 동적으로 지정할 수 있는 기능
    • 가변인자의 선언 : 데이터타입...변수명
    • 가변인자는 메소드 매개변수의 마지막에 선언
    • 가변인자를 선언한 메서드는 되로고 오버로딩 하지는 않는 것이 좋음

5-7) 과제

  • Human클래스 작성
    • 성별, 키, 몸무게, 나이, 이름이 변수
    • 각 변수를 반환할 수 있는 get 메소드 작성
    • BMI수치를 계산하는 메소드 작성(Math.pow함수 사용)

6) 상속과 추상화

6-1) 상속

  • 기존 클래스를 확장하여 새로운 클래스를 작성하는 기법
    • 새로운 클래스 뒤에 extends와 확장할 클래스를 적어서 표현
    • ex) class laptop extends computer
    • 자식 클래스는 부모 클래스의 모든 멤버를 상속(생성자, 초기화 블록 제외)
    • 같은 내용의 코드를 한곳에서 관리함으로써 코드의 중복이 줄어듦
    • 단일 상속만 가능

클래스 간 관계

  • 상속 관계 : is-a 관계
    • 사람은 개발자이다(x)
    • 개발자는 사람이다(o)
    • 사람 : 부모클래스, 개발자 : 자식 클래스
  • 포함 관계 : has-a 관계
  • 한 클래스를 다른 클래스의 참조변수로 사용하는 경우

오버라이딩

  • 부모클래스로부터 상속받은 메서드의 내용을 변경하는 것
    • 이름, 매개변수, 반환 타입이 같아야 함
    • 접근제어자를 부모보다 좁은 범위로 할 수 없음
    • 부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없음
    • 인스턴스 메서드를 static 제어자로 바꿀 수 없음

오버라이딩 vs 오버로딩

  • 오버라이딩 : 부모 클래스에 존재하는 메서드를 자식 클래스에서 재정의 하는 것
  • 오버로딩 : 같은 함수의 이름으로 매개변수를 달리하여 새롭게 만드는 것

super와 super()

  • super
    • 자식 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
  • super()
    • Object 클래스를 제외하고 모든 클래스에는 this() 혹은 super()를 호출해야 함
    • 상속받는 클래스에서 생성자가 없으면 컴파일러가 자동으로 추가
    • 상속받는 클래스에서 생성자가 있으면 명시적으로 super()를 호출해야 함

다형성

  • 여러가지 형태를 가질 수 있는 성질
    • 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조 가능

참조변수와 다형성

  • 서로 상속관계에 있는 클래스 사이에서만 형변환이 가능
  • 메서드 매개변수가 같은 부모 클래스라면 부모 클래스 타입을 매개변수 타입으로 선언 가능
  • 배열 혹은 자료구조에 부모 클래스로 매개변수로 지정하면 여러 자식 클래스를 저장 가능
  • instanceof 연산자로 참조변수가 참조하는 인스턴스의 실제 타입을 확인하는데 사용 가능

6-2) Package란?

  • 물리적으로 관련이 있는 클래스 파일들을 포함하는 하나의 디렉토리
    • 계층구조를 .(점)으로 구분
    • 모든 클래스는 반드시 한 패키지에 속해야 함
    • 같은 클래스 이름이라도 서로 다른 패키지에 속하면 구별이 가능

Import문

  • Java 컴파일러에게 소스 파일에 사용된 클래스의 패키지에대한 정보를 제공
    • Import문으로 사용하고자 하는 class파일의 패키지를 명시해주면 클래스 사용 시 생략 가능
    • Import문에 package.*을 하더라도 하위 패키지의 모든 클래스를 포함하는 것은 아님
    • 주로 하위 패키지.*로 구체적으로 명시
    • import static 문으로 작성하면 클래스 사용 시, 클래스 생략 가능

제어자

  • 변수, 메서드, 클래스 등에 대한 접근이나 어떤 기능적인 부분에 대해 지정해주는 것
    • 하나의 대상(변수, 메서드, 클래스)에 대해 여러 제어자를 조합하여 사용할 수 있으며, 접근제어자는 한가지만 가능
    • 각 대상의 선언부에 함께 표시

제어자 종류

  • 접근 제어자
    public, protected, default, private

  • 그 외의 제어자
    static, final, abstract, native, transient, synchronized, volatile, strictfp

제어자 특징

  • static - 공통적인, 인스턴스가 아닌 클래스에 관련 있음을 알리는 제어자
    • 멤버변수, 메서드, 초기화 블럭에 사용 가능
    • 인스턴스를 생성하지 않고 호출이 가능
  • final - 마지막의 변경할 수 없도록 하는 제어자
    • 클래스, 메서드, 멤버변수, 지역변수에 사용 가능
    • 생성자를 통해 final이 붙은 멤버변수를 초기화 할 수 있음
  • abstract : 추상의, 대상이 미완성임을 알리는 제어자
    • 클래스와 메서드에 사용 가능
    • 클래스에 사용하면 추상클래스(추상 메서드가 포함된 클래스)
    • 메서드에 사용하면 추상메서드(구현은 하지 않고 선언만 된 메서드)

접근 제어자의 특징

  • 외부에서 클래스 내부의 변수에 대한 접근을 제어
    • 캡슐화와 밀접한 연관성
  • 제어자 규칙
    • 클래스에 abstract와 final을 동시에 사용할 수 없음
    • 메서드에 static과 abstract를 같이 사용할 수 없음
    • 추상 메서드의 접근제어자가 private면 안됨
    • 메서드에 private과 final을 같이 사용할 필요는 없음

6-3) 내부 클래스

  • 긴밀한 관계가 있는 클래스를 클래스 안에 선언하여 사용하는 방법
    • 내부클래스에서 외부클래스의 멤버들을 쉽게 접근 가능
    • 코드의 복잡성을 줄임
    • 내부 클래스의 종류는 변수 선언 위치와 동일(인스턴스, static, 메서드 내부)
  • 인스턴스 클래스
    • 외부 클래스의 인스턴스 멤버를 객체 생성 없이 접근 가능
    • static 클래스는 바로 접근 가능
  • static 클래스
    • 외부 클래스의 인스턴스 멤버를 객체 생성 후 접근 가능
  • 내부 클래스중에서 static 클래스만 static 멤버를 가질 수 있음
  • final과 static이 동시에 붙은 변수는 상수이므로 모든 클래스에 정의 가능

익명 클래스

  • 이름이 없는 클래스로 추상 클래스 혹은 인터페이스를 바로 객체로 생성해서 반환
    • 단 하나의 추상클래스 혹은 인터페이스를 바로 생성, 일회용 클래스
    • 생성자가 없음
    • 클래스 마지막에 ;(세미콜론)을 붙여 구현이 끝났음을 표현
    • 인터페이스 혹은 추상 클래스의 미구현 메서드를 구현해야 함

6-4) 추상클래스와 인터페이스

추상클래스란?

  • Class에 abstract 제어자가 붙은 미완성인 클래스
    • 클래스를 인스턴스화 할 수 없음
    • 다중 상속 불가능
    • 추상 메서드를 가진 클래스

추상 메서드

  • 선언부만 존재하고, 구현부가 없는 메서드
    • 추상클래스를 상속받은 클래스에서는 추상 메서드를 반드시 구현해야 함
    • 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 함
      하나의 추상 메서드를 가진 추상 클래스
public abstract class Animal {
	abstract void eatSomething();
}

추상 클래스 상속후 추상 메서드 구현하기

public class Dog extends Animal{
	@Override
    void eatSomething(){
    	System.out.println("강아지는 사료를 먹습니다");
    }

인터페이스(interface)란?

  • 추상 메서드, 디폴트 메서드, static 메서드, 상수만 가진 클래스
    • 추상 클래스보다 추상화가 높음
    • 다중 상속 가능
    • 인스턴스 생성 불가
    • 다형성이 적용됨
    • 표준화 시켜 개발함으로써 개발자 간의 독립적인 개발이 가능(메서드만 공유하면 됨)

인터페이스의 상속과 구현

  • 인터페이스는 static상수만 정의 가능
  • 조상 클래스의 멤버변수와 충돌 가능성이 거의 없음
  • 개발자 간에 기능을 제공하는 쪽과 사용하는 쪽이 존재
    • 기능을 사용하는 쪽에서는 인터페이스 선언부만 알면 됨
public interface Vehicle {
    void take();
    void move();
}

interface 구현

public class Car implements Vehicle{

    @Override
    public void take() {
        System.out.println("자동차 타기");
    }

    @Override
    public void move() {
        System.out.println("자동차 옮기기");
    }
}
public class Airplane implements Vehicle{

    @Override
    public void take() {
        System.out.println("비행기 타기");
    }

    @Override
    public void move() {
        System.out.println("비행기 이동하기");
    }
}

디폴트 메서드

  • 인터페이스에 구현 가능한 메서드
  • 접근제어자는 public(생략가능), 반환 타입 앞에 default 표기, 추상 메서드와 다르게 구현해야 함
  • 디폴트 메서드와 기존 메서드의 이름이 중복되면 충돌이 발생
  • 여러 인터페이스의 디폴트 메서드 충돌 : 인터페이스를 구현한 클래스에서 오버라이딩
  • 상위 클래스와 디폴트 메서드 충돌 : 상위 클래스의 메서드가 상속됨
public interface Vehicle {
    void take();
    void move();

    default void refuel(){
        System.out.println("Need to refuel gasoline");
    }
}

default 메서드 사용하기

package Chapter7;

public class DefaultMethodExample {
    public static void main(String[] args) {
        Vehicle car = new Car();
        Airplane airplane = new Airplane();

        car.move();
        car.take();
        car.refuel();

        airplane.move();
        airplane.take();
        airplane.refuel();
    }
}

추상 클래스 vs 인터페이스

  • 공통점
    • 인스턴스화가 불가능
    • 내부의 추상 메서드를 모두 구현해야 함
  • 차이점
  • 인터페이스는 다중 상속이 가능, 추상 클래스는 단일 상속만 가능
  • 인터페이스는 제어자로 public static final 혹은 public abstract만 가능
  • 공통 기능과 사용 의도의 차이

과제1(상속)

Human 이라는 이름의 부모클래스를 구현하고, 이를 상속받는 Police와 Doctor, Developer이라는 이름의 자식 클래스를 구현하세요.

  • Constructor 생성
  • Field : String name, String Id, String gender;
  • Method : showRole() - 각 직업의 정보를 출력하는 메서드
    updateInfo() - 이름, 성별, Id를 변경하는 메서드

과제2(인터페이스)

Controller라는 인터페이스를 작성하고, 이를 구현하는 TvController, AirConditionerController를 작성하세요.

  • 공통변수 : Boolean powerFlag
  • TV변수 : channel, Volumn
  • Method : pressPlusButton(), pressMinusButton(),pressUpButton(), pressDownButton(), on(), off()
  • TvController, AirConditionerController 내용을 출력하는 함수를 각각 정의

0개의 댓글