
자바의 자료형
자료형 | 설명 | 크기(바이트) | 범위 |
int | 부호있는 정수 | 4바이트 | 21억까지 |
long | 부호있는 정수 | 8바이트 | 경까지 |
double | 부동소수점형 | 8바이트 | 21억까지 |
char | 문자형 | 2바이트 | ㅤ |
boolean | 논리형 | 1비트 | true(1) or false(0) |
String은 char의 배열
var : 모든 타입을 다 받을 수 있음
형 변환
형 변환 : 다른 자료형으로 변환
묵시적 형변환 : 큰 걸 바라봄
예시) int를 string으로 변환
n+””에서 +는 결합 연산자
명시적 형변환 : 다운 캐스팅
상속) 다형성 → 자식을 부모에게 넣는 것은 가능
부모를 자식에게 넣으려면 다운 캐스팅 해야 함
스캐너
Scanner : 키보드로 값을 입력받을 수 있음
형태 : Scanner 변수명 = new Scanner(System.in);
변수 = 변수명.next자료형(); // 변수에 입력받은 값 집어넣기
산술 연산자, 관계 연산자, 논리 연산자
산술 연산자 : +(더하기), -(빼기), *(곱하기), /(몫), %(나머지)
x++ : x=x+1
관계 연산자 : ==, !=, >, <, >=, <=
논리 연산자 : &&(and), ||(or), !(not)
if문
1줄 일 때 {} 생략 가능
걸러낼 땐 else 사용 안함
참 혹은 거짓 같은 경우에는 else 사용
형태 : if(){} 메서드는 아니나 메모리 구조는 동일 → 큐, 스택 생성
{} → 큐, 스택 생성
스택의 생명주기 : 메인 큐가 끝날 때까지
package ex03;
import java.util.Scanner;
public class EvenOdd {
public static void main(String[] args) {
int number; // mian에 뜸 -> main 스택은 4Byte
Scanner sc = new Scanner(System.in); // sc는 main 스택, Scanner는 힙에 뜸
System.out.println("정수를 입력하시오: ");
number = sc.nextInt();
if(number % 2 == 0){
System.out.println("짝수");
} else{
System.out.println("홀수");
}
}
}

if문이 참일 때 스택이 열림
if문 안에는 main 스택의 모든 것 사용 가능
if문 안에 변수 → 지역 변수
지역변수는 if 스택 안에 들어오고 main에서 사용 불가
for문과 while문
for문 : 끝을 알 수 있을 때 사용
while문 : 끝을 알 수 없을 때 사용
스코프 : 메모리에 떠 있는 기간
static 사용시) 클래스명.변수명
heap 사용시) heap의 변수(stack에 있음)
{}안에 만들어지면 다 스택!
package ex03;
public class ForExample1 {
public static void main(String[] args) {
for(int i = 0; i <5; i++){
System.out.println("i의 값은: " + i); // 큐에 담김
}
}
}
for문 안에 i : 지역변수 → 스택에 저장
스택이 실행후 닫혀서 다른 곳에서 사용 불가
for문 {}안에 내용 : 큐에 담김
1) a메서드 호출 후 내부 스택이 닫히기에 heap에 있는 Dog에 접근이 불가
public static void a() {
Dog d1 = new Dog();
}
public static void b() {
Dog d2 = new Dog();
}
public static void main(String[] args) {
a();
}
2) a 호출 후 내부 스택이 닫히기에 heap에 있는 Dog에 접근하기 위해 return 값으로 변수를 받아서 heap에 있는 Dog에 접근 가능
new Dog는 가비지 컬렌션의 대상이 됨
public static void a() {
Dog d1 = new Dog();
return d1;
}
public static void b() {
Dog d2 = new Dog();
}
public static void main(String[] args) {
a(); // a() = d1
b(d1);
}
배열
벡터 : 같은 타입이 연속된 것
같은 타입으로만 되어야 엑세스가 빠름
배열은 인덱스에 저장
맨 처음은 0번지
최대번지 n-1
그 이상은 오류 발생
객체
객체 : 상태와 동작을 가지고 있음 = 오브젝트
new 할 수 있으면 오브젝트
존재 가능하면 다 오브젝트
클래스 : 오브젝트
오브젝트로 만들기 싫으면 추상 클래스로 만들면 됨
유틸리티 클래스
유틸리티 클래스 : 상태가 없고 행위(메서드)만 있는 경우
사용하는 기법 : 기능만 수행함
객체지향 코드는 아님
예시) 계산기, 복잡한 알고리즘 수행
캡슐화
캡슐화 : 클래스와 상태를 하나로 묶음
메서드의 책임을 하나씩 만듦 → 최대한 책임을 줄여야 분리 가능
객체가 하나의 캡슐
Protected : 접근 제어자, 상속 관계에 있는 클래스에서 사용
1) Private일 때 메서드 사용
package ex03.test;
class 라면 {
private void 물끓이기() {
}
private void 스프넣기() {
}
private void 면넣기() {
}
private void 계란넣기() {
}
}
class 신라면 implements 행위 {
private void 물끓이기() {
}
private void 스프넣기() {
}
private void 면넣기() {
}
private void 계란넣기() {
}
}
public class ScopeEx02 {
public static void main(String[] args) {
라면 la = new 라면();
물끓이기();
스프넣기();
면넣기();
계란넣기();
}
}
2) Private일 때 하나만 Public으로 열어서 사용 → 정보 은닉
package ex03.test;
interface 행위 {
void start();
}
class 삼양라면 implements 행위 {
private void 물끓이기() {
}
private void 스프넣기() {
}
private void 면넣기() {
}
private void 계란넣기() {
}
@Override
public void start() {
물끓이기();
면넣기();
스프넣기();
계란넣기();
}
}
class 신라면 implements 행위 {
private void 물끓이기() {
}
private void 스프넣기() {
}
private void 면넣기() {
}
private void 계란넣기() {
}
@Override
public void start() {
물끓이기();
스프넣기();
면넣기();
계란넣기();
}
}
public class ScopeEx02 {
public static void main(String[] args) {
삼양라면 la = new 삼양라면();
la.start();
신라면 la2 = new 신라면();
la2.start();
}
}
정보 은닉
상태의 접근 제어자 : Private
메서드를 은닉시켜놓고 하나만 public으로 열어서 사용할 수 있도록 하는 것
상속, 컴포지션
상속(is 관계)
다형성이 지켜져야 함 → 자식 클래스는 부모 클래스의 모든 속성(상태)과 동작(행위)를 물려받음
다형성 : 다양하게 부를 수 있고 타입 변경이 가능
자식이 부모의 클래스의 메서드를 재정의해서 호출할 경우
동적 바인딩 : 부모 메서드 무효화 자식 메서드 실행
컴포지션(has 관계)
컴포지션 : 결합
잘 만들어진 클래스를 쓰고 싶을 때 필요한 객체를 상태로 가지고 있음
1) 상속
package ex06.example7;
public class Burger { //private니까 생성자 필요
private String name;
private int price;
public Burger(String name, int price) { // 생성자 : 초기화
this.name = name;
this.price = price; // 가격 고정 -> 재사용 불가, 할인x
System.out.println(name + "가 만들어졌어요");
}
//무조건 getter(상태확인) 만들기
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
package ex06.example7;
public class ShrimpBuger extends Burger{
private String material;
public ShrimpBuger(String name, int price, String material) {
super(name, price);
this.material = material;
}
public String getMaterial() {
return material;
}
}
package ex06.example7;
public class Coke {
private String name;
private int price;
public Coke(String name, int price) {
this.name = name;
this.price = price;
System.out.println(name + "가 만들어졌어요");
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
package ex06.example7;
public class LotteApp {
public static void main(String[] args) {
Burger b1 = new Burger("기본버거", 1000); // [Burger]
Burger b2 = new ShrimpBuger("새우버거", 2000, "새우"); // [Burger, ShrimpBuger]
Coke c1 = new Coke("콜라", 1000);
System.out.println();
BurgerSet set1 = new BurgerSet(
new Burger("기본버거", 1000),
new Coke("콜라", 1000)
);
/* System.out.println(set1.getBurger().getPrice());
System.out.println(set1.getCoke().getPrice());*/
System.out.println("총 가격은 : " + set1.getTotalPrice());
}
}
2) 컴포지션 : 필요한 객체를 상태로 가지고 있으면 됨
package ex06.example7;
public class BurgerSet { // has : burger와 coke
private Burger burger;
private Coke coke; // 필요한 객체를 상태로 가지고 있으면 됨
public BurgerSet(Burger burger, Coke coke) { // 레퍼런스 변수
this.burger = burger;
this.coke = coke;
System.out.println("버거 세트가 만들어졌어요");
}
public int getTotalPrice(){
return burger.getPrice() + coke.getPrice(); // this.burger, this.coke
}
public Burger getBurger() {
return burger;
}
public Coke getCoke() {
return coke;
}
}
다형성
다양하게 부를 수 있는 것
타입변경 가능
추상화
추상 클래스 : 뼈대
추상화 : 공통적인 것만 끌어올리는 것
클래스
클래스 : 설계도
오버로딩
이름은 같으나 타입의 갯수가 다를 때
생성자 : 객체가 처음 만들어질 때 모든 상태값을 초기화
this
this : 인스턴스 변수를 가리킴 → 현재 객체를 가리킴
해당 메서드를 호출한 인스턴스 자신을 참조하는 데 사용
생성자가 있으면 힙에 뜸 → 객체가 만들어진 것 = new한 상태
public Circle(int radius){ // 파라미터 : 실행하는 시점에만 뜸
this.radius = radius; // this는 힙
}
접근제어자
public : 공개할 때
private : 공개 안할 때
default : 기본값으로 아무것도 안 넣는 것 / 잘 안씀
private라서 값을 확인하고 설정하기 위해 사용
getter : 상태 확인 / 접근자 : 무조건 필요
setter : 기존 상태를 무시하고 상태 설정 / 설정자 : 필요한 것만 직접 생성
변경될 수 있는 것들만 생성
시간의 상태에 따라서 값이 변경됨
package ex03.test;
class Account {
private int number; // 1111
private String pw; // 8877
private String author; // 최주호
private int balance; // 1000
public Account(int number, String pw, String author, int balance) {
this.number = number;
this.pw = pw;
this.author = author;
this.balance = balance;
}
public int getNumber() {
return number;
}
public String getPw() {
return pw;
}
public String getAuthor() {
return author;
}
public int getBalance() {
return balance;
}
public void chanagePassword(String pw){
this.pw = pw;
}
public void changeAuthor(String author) {
this.author = author;
}
public void deposit(int amount){
this.balance = this.balance + amount;
}
public void withdraw(int amount){
this.balance = this.balance - amount;
}
public void setBalance(int balance){
this.balance = balance;
}
}
public class ScopeEx02 {
public static void main(String[] args) {
// 1. 계좌생성 (2023.12.25)
Account account = new Account(1111, "8877", "최주호", 1000);
// 2. 입금 (2023.01.10) - 5000
account.deposit(5000);
// 3. 비밀번호 변경 (2023.01.20) - 9988
account.chanagePassword("9988");
// 4. 계명 - 이름 변경 (2023.02.20) - 홍길동
account.changeAuthor("홍길동");
// 5. 계좌번호변경 - 은행 - 불가능합니다.
// 6. 출금 - 500원
account.withdraw(500);
// 7. 5000 원 입금
int currentBalance = account.getBalance();
int balance = currentBalance + 5000;
account.setBalance(balance);
}
}
Share article