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
- 반복문을 이용해서 구구단 출력
- 반복문을 이용해서 구구단 중 홀수 단 출력
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 내용을 출력하는 함수를 각각 정의