반응형

객체의 개념
- 소프트웨어 객체는 현실 세계의 객체를 필드와 메서드로 모델링한 것
- 소프트웨어 객체는 상태를 필드(Field)로 정의하고, 동작을 메서드(Method)로 정의.
- 필드는 객체 내부에 선언된 변수를 의미하고, 메서드는 객체 내부에 정의된 동작

절차 지향 프로그래밍
- 일련의 동작을 순서에 맞추어 단계적으로 실행하도록 명령어를 나열
- 데이터를 정의하는 방법보다는 명령어의 순서와 흐름에 중점
- 수행할 작업을 예상할 수 있어 직관적인데, 규모가 작을 때는 프로그래밍과 이해하기가 용이
- 소프트웨어는 계산 위주이므로 절차 지향 프로그래밍이 적합
객체 지향 프로그래밍
- 소프트웨어의 규모가 커지면서 동작과 분리되어 전 과정에서 서로 복잡하게 얽혀 있는 데이터를 사용했기 때문에 절차 지향 프로그래밍 방식의 한계
- 절차 지향 프로그램은 추후 변경하거나 확장하기도 어려움
- 현실 세계를 객체 단위로 프로그래밍하며, 객체는 필드(데이터)와 메서드(코드)를 하나로 묶어 표현
- 객체지향언어 = 프로그래밍 언어 + 객체지향개념(규칙)
- Object Oriented Programming(OOP)
- 캡슐화, 상속, 추상화, 다형성
객체의 상호작용
현실세계의 모든 현상은 객체와 객체간의 상호작용으로 이루어져 있다.
객체간의 관계
- 사용관계 - 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계
- 상속관계 - 부모와 자식 관계
- 집합관계 - 완성품과 부품의 관계
객체와 클래스
- 클래스 - 객체를 정의해 놓은 것으로 객체를 생성하는데 사용
- 객체 - 실제로 존재하는 것, 사물 또는 개념으로 객체가 가지고 있는 기능과 속성에 따라 용도가 다름
특징
-캡슐화: 관련된 필드와 메서드를 하나의 캡슐처럼 포장해 세부 내용을 외부에서 알 수 없도록 감추는 것
- 필드와 동작을 하나로 묶고 실제 구현 내용을 외부에 감추는 것
- 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하지 위함
- 접근 제어자(public , private)를 사용해서 캡슐화된 멤버를 노출시킬 것인지 숨길것인지를 결정

- 상속: 자녀가 부모재산을 상속받아 사용하듯이 상위 객체를 상속받은 하위 객체가 상위 객체의 매서드와 필드를 사용하는 것
- 상속은 개발된 객체를 재사용하는 방법 중 하나, 유지보수 시간을 최소화시켜줌

- 다형성 : 대입되는 객체에 따라서 메서드를 다르게 동작하도록 구현하는 기술. 실행 도중 동일한 이름의 다양한 구현체 중에서 매서드를 선택 가능
- 사용방법은 동일하지만 실행결과가 다양하게 나오는 성질
- 자동차의 부품에 해당하는 객체를 교환하면 같은 사용법이라도 실행성능이 다르게 나올 수 있음.

- 추상화
현실 세계의 객체는 수많은 상태가 있고 다양한 동작을 하지만, 클래스에 모두 포함하기는 어렵기에 추상화(Abstraction)하는 과정이 필요
추상화는 현실 세계의 객체에서 불필요한 속성을 제거하고 중요한 정보만 클래스로 표현하는 일종의 모델링 기법
따라서 사람마다 추상화하는 기법이 같지 않으므로 각 개발자는 클래스를 다르게 정의 가능

 

클래스 선언

  • 형식
class 클래스이름 {
	// 필드
    // 메서드
}

// EX
public class Ball {
	double radius = 2.0;
    double getVolume () {
    	return 4 / 3 * 3.14 * radius * radius * radius;
    }
}
  • 클래스 선언과 파일
    • 보통 소스파일마다 하나의 클래스를 선언하지만, 2개 이상의 클래스를 하나의 파일로 선언 가능
    • 하나의 파일에 클래스가 둘 이상 있다면 하나만 public으로 선언할 수 있고, 해당 클래스 이름은 소스 파일 이름과 동일해야 함
// Ball.java

public class Ball { }
class Cylinder { }

 

  • 클래스의 구성 요소
    • 멤버
      • 필드
      • 메서드
    • 생성자
    • 참고
      • 지역 변수는 메서드 내부에 선언된 변수
      • 매개 변수도 일종의 지역 변수임
변수의 종류 선언위치 생성시기 메모리 위치
클래스 변수 클래스 영역 클래스가 메모리에 올라갈때 Method 영역
인스턴스 변수 인스턴스가 생성되었을때 Heap 영역
지역 변수 블럭내부 변수 선언문이 수행되었을때 Heap 영역

JVM 런타임 데이터 영역

메서드 영역 스택 영역 힙 영역
프로그램실행코드 method2 frame
지역변수
매개변수

method1 frame
지역변수
매개변수
객체 1
객체 2
객체 3
static 영역
상수 풀

클래스 변수

  • static을 붙이며, 클래스가 메모리에 로딩될 때 생성된다. JVM메모리 영역 중 Method 영역에 로드된다.
  • 모든 클래스의 객체가 공통된 변수를 공유한다.
  • 이미 메모리에 올라가 있어서 클래스의 객체를 생성하지 않고도 사용 가능하다

인스턴스 변수

  • 클래스의 객체를 생성할 때 만들어지며, JVM 메모리 영역 중 Heap 영역에 로드된다.
  • 클래스의 객체마다 독립적인 값을 가질 수 있다.

지역 변수

  • 블럭 내부에서 변수 선언문이 실행되었을 때 생성된다.(초기화 블록)
  • 블럭이 종료되면 소멸된다
  • JVM메모리 영역중 Heap영역에 로드된다.

참고 - 자바의 메모리 구조

  • 1) PC Register - 현재 수행중인 JVM명령어 저장
  • 2) JVM stack - 호출된 메소드의 매개변수, 지역변수, 리턴정보 저장
  • 3) Native Method stack - 자바 외 C, C++로 구현된 정보 저장
  • 4) Heap : 런타임 중 생성되는 객체들이 저장
  • 5) Method :전역변수, 정적(Static)변수, 메소드 정보 저장
  • >>> 가비지 컬렉션 : Garbage Collector가 주기적으로 더 이상 사용하지 않는 메모리를 수집하고 해제하는 역할을 함
  • >>> Heap 영역과 달리, Method 영역에 저장된 정보는 가비지 컬렉션의 대상이 되지 않으며, 프로그램이 종료될 때 해제
Runtime Data Area
Method Heap PC Register JVM stack Native Method Stack

필드와 지역 변수의 차이

  • 필드는 기본 값이 있지만, 지역변수는 기본값이 없어 반드시 초기화
  • 필드는 클래스 전체에서 사용할 수 있지만 지역변수는 선언된 블록 내부의 선언된 후에만 사용 가능

필드와 메서드 접근

  • 클래스 내부에서 자신의 멤버에 접근하려면 참조 변수 this 혹은 참조 변수 없이 그냥 멤버 이름 그대로 사용하면 됨
  • 예를들어 외부 클래스 Circle의 객체 myCircle이 있다면 myCircle 객체의 radius와 findArea()는 다음과 같은 방식으로 접근

접근자(겟터)와 설정자 (셋터)

  • 필요성
    • 클래스 내부에 캡슐화된 멤버를 외부에서 사용할 필요
  • 접근자와 설정자
    • private으로 지정된 필드의 값을 반환하는 접근자와 값을 변경하는 설정자는 공개된 메서드
    • 일반적으로 접근자는 get, 설정자는set으로 시작하는 이름을 사용
    • 필드 이름을 외부와 차단해서 독립시키기 때문에 필드 이름 변경이나 데이터 검증도 가능

UML (Unified Modeling Language)

  • 1997년 OMG(Object Management Group)에서 표준으로 채택한 통합 모델링 언어
  • 모델을 만드는 표준언어
  • UML 다이어그램을 그리며 모델을 만드는 일은 개발보다 비용이 적게 들긴 하지만, 훨씬 적게 드는것이 아님. 때로는 개발보다 비용이 더 많이 들수도 있음.
  • UML을 사용하는 3가지 유형
    • 다른 사람들과의 의사소통 또는 설계논의
    • 전체 시스템의 구조 및 클래스의 의존성 파악
    • 유지보수를 위한 설계의 backend 문서

생성자

  • 생성자의 의미와 선언
    • 생성자의 역할 : 객체를 생성하는 시점에서 필드를 다양하게 초기화
//생성자 선언방식
클래스이름 (){} // 일반적으로 공개되므로 public으로 선언되지만 아닐 수도 있음.

// 생성자 사용
클래스이름 변수 = new 클래스이름();
/*
* 생성자 이름은 클래스 이름과 같다.
* 생성자의 반환 타입은 없다.
* 생성자는 new연산자와 함께 사용하며, 객체를 생성할 때 호출한다.
* 생성자도 오버로딩할 수 있다.
*/
  • 디폴트 생성자
    • 모든 클래스는 최소한 하나의 생성자가 있음
    • 만약 생성자를 선언하지 않으면 컴파일러가 자동으로 디폴트 생성자를 추가
class Circle {
	private double radius;
    public double getRadius(){}
    public void setRadius(double radius){}
}

public class CircleDemo {
	public static void main(String[] args){
    	Circle myCircle = new Circle();
    }
}

 

생성자 오버로딩

  • 생성자도 메서드처럼 오버로딩 가능
class Circle {
	double radius;
    String color;
    public Circle(double r, String c){
    	radius = r;
        color = c;
    }
    public Circle(double r){
    	radius = r;
        color = "Blue";
    }
    public Circle(String c){
    	radius = 10.0;
        color = c;
    }
    public Circle(){
    	radius = 10.0;
        color = "Red";
    }
}
  • this와 this()
class Square{
	private double side;
    public void setRadius(double s){
    	side = s;
    }
}

class Square {
	private double side;
    
    public void setRadius(double side) {
    	this.side = side;
    }
}
  • 연속 호출
// 예를 들어 반환 타입이 void인 setName(String name), setAge(), sayHello()라는 메서드를 가진 
// Person 클래스가 있다고 가정

Person person = new Person();

person.setName("hoho");
person.setAge("100");
person.sayHello();

// setName()과 setAge()의 반환이 this라면

Person person2 = new Person();
person2.setName("hoho").setAge(200).sayHello();
  • 인스턴스 멤버와 정적 멤버
    • 자바는 static 키워드로 클래스의 필드를 공유할 수 있도록 지원
    • 인스턴스 변수 : static키워드로 지정되지않아 공유되지 않는 필드로 인스턴스마다 자신의 필드를 생성
    • 정적 변수 혹은 클래스 변수 : static 키워드로 지정하여 모든 인스턴스가 공유하는 필드
    • 인스턴스 변수는 객체 별로 관리, 객체를 생성할 때 인스턴스 변수도 생성되고 객체가 소멸될 때는 자동으로 소멸
    • 반면 정적 변수는 클래스 로더가 클래스를 메서드 영역에 적재할 때 생성
    • 정적 메서드의 유의 사항
      • 객체와 관련된 인스턴스 변수를 사용할 수 없다.
      • 객체와 관련된 인스턴스 메서드를 호출할 수 없다.
      • 객체 자신을 가리키는 this 키워드를 사용할 수 없다.
  • 정적 멤버의 활용
클래스이름.정적변수이름
클래스이름.정적메서드이름()
  • 상수는 변경되지 않는 변수이기 때문에 final 키워드로 지정하지만, final로만 지정하면 객체마다 자신의 기억공간.
  • 상수는 값이 변경되지 않으므로 객체마다 따로 기억 공간을 할당할 필요가 없다. 따라서 static final로 지정해서 선언
static final 데이터형 상수 = 초깃값;
  • 정적 블록
    • 정적변수의 초기화 과정이 for 문이나 오류 처리처럼 복잡하다면 과정이 그리 간단하지 않을 것이다. 대신에 정적변수의 초기화가 복잡할 때는 다음과 같이 정적 블록을 사용할 수 있다.
  • Object클래스
    • 자바에서 모든 클래스의 최상위 부모클래스
    • 명시적으로 부모를 extends하지 않은 클래스들의 묵시적 부모가 Object라고 보면 됨
728x90

'CODING PRACTICE > Java' 카테고리의 다른 글

Java__Basic(2)  (5) 2025.08.04
Java__Basic(1)  (5) 2025.08.03
반응형

제어문과 메서드

제어문

  • 종류
    • 조건문
    • 반복문
    • 분기문

조건문

  • 블록{}
  • 여러 문장을 하나로 묶어주는 것
if(조건식)
{ // 블록의 시작
	System.out.println("yes"); // 탭에 의한 들여쓰기를 해주는 것이 좋다.
} // 블록의 끝

/*
* if 문에 속한 문장이 하나이며 { } 을 생략할 수도 있음
* 블록기호를 생략한 채로 들여쓰기해서 두개의 문장을 적는 경우
* 들여쓰기가 블록과 같은 역할을 하지 않으므로 주의 필요
*/
  • 조건식의 다양한 예
조건식 조건식이 참일 조건
90 <= x && x <= 100 정수 x가 90이상 100이하일 때
x < 0 || x > 100 정수 x가 0보다 작거나 100보다 클 때
x%3 == 0 && x%2 !=0 정수 x가 3의 배수이지만, 2의 배수는 아닐때
ch=='y' || ch =='Y' 문자 ch가 'y' 또는 'Y'일 때
ch == '   ' || ch =='\t' \\ ch =='\n' 문자 ch가 공백이거나 탭 또는 개행 문자일 때
'A'<= ch && ch <= 'Z' 문자 ch가 대문자일 때
'a'<= ch && ch <= 'z' 문자 ch가 소문자일 때
'0' <= ch && ch <= 9 문자 ch가 숫자일 때
str.equals("yes") 문자열 str의 내용이 "yes"일 때 (대소문자 구분)
str.equalsIgnoreCase("yes") 문자열 str의 내용이 "yes"일 때 (대소문자 구분안함) 
  • 단순 if 문
    • 조건식이 참일 때 괄호 안의 문장들을 수행하고 거짓이면 실행하지 않고 그 다음 문장으로 넘어간다.
if (조건식){ // 조건식이 참이면 실행문 실행 
	// 실행문(들);
}
// 조건식이 거짓일 때 조건식의 밖의 실행문 실행
  • if ~ else 문
    • 조건식이 참일 때 참(if) 괄호 안의 문장들을 수행하고 거짓이면 거짓(false)괄호 안의 문장들을 수행한다.
if(조건식){
	// 조건식이 참일 때 실행
	// 실행문(들);
} else {
	// 조건식이 거짓일 때 실행
	// 실행문(들);
}
  • 다중 if 문
if (조건식1) {
	// 조건식1이 참일 때 실행
	// 실행문들;
} else if(조건식2){
	// 조건식1이 거짓이고 조건식 2가 참일 때 실행
} else if(조건식3){
	// 조건식1,2 가 거짓이고 조건식 3이 참일때 실행
}else{
	// 모든 조건을 만족하지 않을 때만 실행
}
  • 중첩 if 문
    • if 문에 다른 if 문이 포함되는 것을 중첩 if문이라고 한다.
    • 주의사항
      • { }를 생략하게 되면 indentation이 있더라도 else블록은 가까운 쪽 if 문과 연결됨

switch문

  • switch문은 if 문과 마찬가지로 조건문의 일종
  • 여러 경로 중 하나를 선택할 할 때 사용
  • 기존 switch문은 낙하 방식으로 콜론 case레이블 이용
  • 자바 14부터는 비낙하 방식의 화살표 case레이블 도입, switch 연산식 가능
  • 콜론 레이블 사용하는 기존 switch문
switch (변수 연산식도 가능) {
	case 상수 1: // 0개 이상의 실행문 // break문과 같은 실행문이 없으면 계속해서 다음 case 레이블에 있는 실행문을 수행
    // ...
    default : 0개 이상의 실행문 // 선택사항
}
  • 변수 값에 따라 해당 case로 가서 실행문을 실행함
  • 0개 이상의 case절과 0이나 1개 default절로 구성
  • switch 변수로 정수 타입만 사용할 수 있었지만, 자바 7부터는 문자열과 열거 타입도 사용가능
  • case문의 값은 정수 상수(문자 포함, 변수는 불가능), 문자열이 가능하고 중복되지 않아야 함
  • break는 다음 case를 실행하지 않고 switch문을 빠져나갈 때 사용함, break가 없다면 다음 case가 연이어 실행됨
public class Switch1Demo {
	public static void main(String[] args) {
    	int number = 2;
        
        switch (number) {
        	case 3: System.out.print("*");
            case 2: System.out.print("*")'
            case 1: System.out.print("*");
        }
	}
}
public class Switch2Demo {
	public static void main(String[] args) {
    	wholslt("호랑이");
        wholslt("참새");
        wholslt("고등어");
        wholslt("곰팡이");
	}
    
    static void wholslt(String bio) {
    	String king ="";
        switch (bio) {
        case "호랑이":
        case "사자":
        	kind = "포유류";
            break;
        case "독수리" :
        case "참새" :
        	kind = "조류";
            break;
        case "고등어":
        case "연어" : 
        	kind = "어류";
            break;
		default:
        	System.out.print("어이쿠!");
            kind = "...";
    	}
    System.out.printf(%s는 %s이다. \n", bio, kind);
    }
}
  • 개선된 switch문
    • 필요성 : 깔끔하지 못하고 가독성도 떨어지며, break문의 누락으로 인한 오류 가능성도 크다
    • 자바 14부터 다음과 같은 변화를 도입
      • 화살표 case레이블
      • Switch 연산식
      • 다중 case 레이블
      • Yield 예약어
    • 자바 14부터는 기존 switch문도 연산식, 다중 case레이블, yield 예약어를 허용
    • 개선된 switch 문에서는 break문을 사용할 수 없음
switch (day) {
	case MONDAY:
    case FRIDAY:
    case SUNDAY:
    	System.out.println(6);
        break;
    case TUSEDAY:
    	System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
    	System.out.println(8);
        break;
    case WEDNESDAY:
    	System.out.println(9);
        break;
}

// 화살표 case 라벨과 다중 case라벨로
// 개선된 switch 문
switch (day) {
	case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY 				-> System.out.println(7);
    case THURSDAY, SATURDAY 	-> System.out.println(8);
    case WEDNESDAY				-> System.out.println(9);
}
  • Switch 문은 실행문으로 사용될 수도 있지만, 연사식으로도 사용될 수 있음
  • case 조건들 -> 다중 case레이블을 이용하면 여러 개의 조건들을 콤마를 이요해서 기술, 가독성이 좋아짐
  •  
int numLetters = switch (day) {
	case MONDAY , FRIDAY, SUNDAY -> 6;
    case TUESDAY				 -> 7;
    ...
    default -> 0; // 값을 리턴할 경우 default 문장이 반드시 있어야 한다.
}
  • yield 예약어를 허용
  • case에 대한 처리는 하나의 문장으로 처리하지만 여러 문장으로 작성해야 하는 경우도 있다. 기존 스위치 문장과는 다르게 여러문장으로 case문장을 작성하기 위해서는 {} 으로 코드 블록을 정의해야한다.
  • 연산식으로 사용하여 값을 리턴할 경우 : 
  • <주의할 점>
int j = switch (day) {
	case MONDAY -> 0;
    case TUESDAY -> 1;
    default -> {
    	int k = day.toString().length();
        int result = f(k);
        yield result;
    }
};
  • yield는 코드 블록 여부와 상관없이 사용가능함.
    • "case 문장 : "  자체가 여러 라인의 코드를 작성할 수 있는 블록으로 인식
String kind = switch (bio) {
	case "호랑이", "사자" :
    	yield "포유류";
    case "독수리", "참새" :
    	yield "조류";
    case "고등어", "연어" :
    	yield "어류"
    default : 
    	System.out.print("어이쿠!");
        yield "...";
};

 

Switch 연산식의 주의 사항

  • 가능한 모든 값에 대하여 일치하는 case레이블이 없으면 오류가 발생
  • 다음 코드에서 변수 n의 모든 가능한 값은 정수이므로 오류 발생
static String howMany (int n) {
	return switch(n){
    	case 1 -> "1개";
        case 2 -> "2개";
    }; // default문은 선택 사항
}

반복문

while 문 

  • 조건식이 true일 경우에 블록 {} 을 반복, false가 되면 반복 멈춤

do ~ while 문

  • 실행 결과에 따라 실행문을 반복
  • while 뒤에 ; 을 붙어야함

for 문

  • 실행문을 여러 번 반복 실행해줘서 코드를 간결하게 만들어 줌
  • 초기식에서는 float타입을 사용하지 않도록 주의할 것

분기문

break문

  • 반복문을 실행중지하거나 조건문인 switch를 종료할 때 사용
  • 대개 if문과 같이 사용되어 조건식에 따라 반복문을 종료함
while () {
	while () {
    	break;
    }
    // break 후 이 줄로 이동해 실행
}


out : while () {
	while () {
    	break out;
    }
}
// break out 후 out 밖으로 나와 코드 실행

 

continue 문

  • 반복문에서만 사용되며 조건식으로 이동할 때 사용
  • break 문과 달리 반복문을 종료하지 않고 계속 반복을 수행함
// 조건식이 만족될때까지 진행
while(조건식){
	continue; 
}

do {
	continue;
} while (조건식);

for(초기식; 조건식; 증감식;) {
	continue;
}
  • Label이 붙어있는 외부 반복문을 계속할 경우 아래와 같이 사용할 수 있음
  •  
outer :
for(int i = 1; i <= 3; i++){
	for(int j = 1; j <= 3; j++){
    	if(i*j == 2){
        	continue outer;
        }
     System.out.println(i*j);
     }
}

메서드

  • 메서드를 이용하면 중복코드를 줄이고 코드를 재사용할 수 있다. 또한 코드를 모듈화해 가독성을 높이므로 프로그램의 품질을 향상시킨다.

메서드의 구조

헤더 접근지정자 객체를 생성하지 않고 실행할 수 있다. 반환타입 메서드 이름 매개변수 목록
public static int sum (int il , int i2) {
본체 int sum = 0;
for (int i = i1; i <= i2; i++)
  sum += i;
return sum;
}

메서드의 호출과 반환

  • 메서드를 호출하면 제어가 호출된 메서드(callee)로 넘어갔다가 호출된 메서드의 실행을 마친 후 호출한 메서드(caller)로 다시 돌아온다. 단 return 문을 사용하면 다음과 같이 메서드의 실행 도중에도 호출한 메서드로 제어를 넘길 수 있다.
public static void main(String[] args){
	int i = 1, j=10;
    int k = sum(i,j);
    System.out.println(k);
}

public static int sum (int i1, int i2) {
	int sum = 0;
    for (int i = i1; i <= i2; i++)
    	sum += i;
   	return sum;
}

 

  • 스택 
    • 밑이 막힌 상자, 넣는 순서대로 위에 차곡차곡 쌓인다.
    • 밑이 막혀있기 때문에 꺼낼때는 위에 있는 것부터 꺼낸다.
  • 호출 스택(call stack) : 메서드 수행에 필요한 메모리가 제공되는 공간
  • 메서드가 호출되면 호출스택에 메모리할당, 종료되면 해제됨
  • 기본형 매개변수
    • 8개 기본형을 매개변수로 하는 매소드, 변수의 값을 읽기만 함(read only)
  • 참조형 매개변수
    • 기본형 이외의 변수를 매개변수로 하는 메소드, 변수의 값을 읽고 변경할 수 있다 (read & write)
    • 참조값(주소) 전달(call by reference) - read & write
      • 메서드의 매개변수로 참조변수를 전달
public class IncrementDemo2 {
	public static void main(String[] args) {
    	RefValue ref = new RefValue();
        ref.x = 10;
        System.out.println("호출 전 ref.x = " + ref.x);
        changeReference(ref);
        System.out.println("호출 후 ref.x = " + ref.x);
    }
    
    static void changeReference(RefValue ref) {
    	System.out.println("메서드 실행 전 ref.x = " ref.x);
        ref.x = 1000;
        System.out.println("메서드 실행 후 ref.x = " + ref.x);
    }
}

class RefValue {
	int x;
}

 

메서드 오버로딩

  • 메서드 시그니처
    • 메서드 이름
    • 매개변수의 개수
    • 매개변수의 타입과 순서를 의미
  • 주의: 리턴 값은 메서드 시그니처에 영향을 주지 않는다.
  • 메서드 이름은 같지만 메서드 시그니처가 다른 메서드를 정의하는 것을 메서드 오버로딩이라고 한다.
public class OverloadDemo {
	public static void main (String[] args) {
    	int i1 = 3, i2 = 7, i3 = 10;
        double d1 = 7.0, d2 = 3.0;
        
        System.out.printf("max(%d, %d) = %d\n", i1, i2, max(i1, i2);
        System.out.printf("max(%.1f, %.1f) = %.1f\n", d1, d2, max(d1, d2);
        System.out.printf("max(%d, %d,%d) = %d\n", i1, i2, i3, max(i1, i2, i3);
   	}
   	public static int max(int n1, int n2) {
    	int result = n1 > n2 ? n1 : n2 ;
        return result;
    }
    public static int max(double n1, double n2) {
    	double result = n1 > n2 ? n1 : n2;
        return result;
    }
    public static int max(int n1, int n2, int n3) {
    	return max(max(n1, n2), n3);
    }
}
728x90

'CODING PRACTICE > Java' 카테고리의 다른 글

Java_Basic(3)_OOP(객체지향)  (5) 2025.08.06
Java__Basic(1)  (5) 2025.08.03
반응형

개요

프로그래밍 언어

  • 컴퓨터와 인간 사이를 연결할 수 있는 매개체이며 컴퓨터에 작업을 시키기 위한 도구
  • 기계어에 가까운 저급언어인 어셈블리 언어부터 자연어에 가까운 고급언어까지 다양
  • 보통 프로그래밍 언어라고 하면 고급 언어를 의미하는데 C, C++, 자바(Java)등
  • 고급 언어로 작성한 소스 코드는 컴파일러(Compiler)라는 시스템 소프트웨어를 이용해 먼저 기계어로 구성된 실행코드로 변환

Java 소개

  • 실행환경(JRE) + 개발도구 (JDK) + 라이브러리(API)
  • JDK(Java Development Kit)와 JRE(Java Runtime Environment)
-  JDK 
-  컴파일러, 디버거, 애플릿 뷰어등
-- JRE
-- 클래스 로더, 자바 API, 실행 시간 라이브러등
--- JVM
--- JIT 컴파일러, 자바 인터프리터 등

 

Java 특징

  • 객체 지향 언어
  • 컴파일 언어 / 인터프리터 언어
  • 플랫폼 독리벅
  • 자동 메모리 관리
  • 멀티 스레딩 지원
  • 동적
  • 안전하고 견고함
  • 함수형 코딩 지원

자바 가상 머신(Java Virtual Machine)

일반 애플리케이션
OS(Windows)
컴퓨터(하드웨어)
  • 자바는 자바 가상 머신(JVM)을 사용하기 때문에 플랫폼 독립적임
Java 얘플리케이션
JVM JVM JVM
OS(Windows) OS(Macintosh) OS(Linux)
컴퓨터(하드웨어) 컴퓨터(하드웨어) 컴퓨터(하드웨어)

 

자바 프로그램 기본 구조

  • 클래스 : 객체 지향 언어에서 프로그램을 개발하는 단위
  • 메서드 : 수행할 작업을 나열한 코드의 모임
  • 실행문 : 작업을 지시하는 변수 선언, 값 저장, 메서드 호출 등의 코드
  • 주석문
구분 주석 기호 설명
행 주석 // // 부터 행끝까지 주석처리
범위 주석 /* */ /*와 */ 사이에 있는 내용은 모두 주석처리
도큐먼트 주석 /** */ /** 와 */ 사이에 있는 내용은 모두 주석처리
javadoc명령어로 API 도큐먼트를 생성하는데 사용함

 

실행문과 세미콜론

  • 변수 선언, 변수 값 저장, 메소드 호출에 해당하는 코드
  • 실행문 끝에는 반드시 세미콜론(;)을 붙여 실행문의 끝임을 표시해야함
int x;	// 변수 x선언
x = 1;  // 변수 x에 1 값을 저장
int y = 2;  // 변수 y를 선언하고 2 값을 저장
int result = x + y;  // 변수 result를 선언하고 변수 x와 y를 더한 값을 저장
System.out.println(result);  // 콘솔에 변수의 값을 출력하는 println() 메소드 호출

 

public class Hello {
	public static void main(String[] args){
    	/*
        * 메인 메소드 내부
        */
        
        System.out.println("안녕"); // 화면에 문자 출력
		System.out.println("안녕" + "!");
        
        String hello = "안녕 !";
        System.out.println(hello);
    }
}

식별자

규칙

  • 문자, 언더바(_), $로 시작해야한다. 한글도 가능하며, 영문자는 대소문자 구분한다.
  • +, - 등 연산사를 포함하면 안된다.
  • 자바 키워드를 사용하면 안된다.
  • 길이에 제한이 없다.

자바 키워드

분류 키워드
데이터 타입 byte, char, short ,int, long, float, double, boolean
접근 지정자 private, protected, public
제어문 if, else, for, while, do, break, continue, switch, case
클래스와 객체 class, interface, enum, extends, implements, new, this, super,instanceof, null
예외 처리 try, catch, finally, throw, throws
기타 abstract, assert, const, default, false, final, import, native, package, return, static, strictfp, synchronized, transient, true, void, volatile

 

관례

  • 변수와 메서드는 모두 소문자로 표기, 단 복합 단어일때 캐멀케이스
  • 클래스와 인터페이스는 첫자만 대문자로, 단 복합 단어일때 캐멀케이스
  • 상수는 전체를 대문자로 표기, 복합단어일때는 언더바(_)로 연결

 데이터 타입

의미

  • 값과 값을 다룰 수 있는 연산의 집합을 의미
  • 기본형(primitive type) - 8개, 실제 값을 저장
  • 참조형(referencce type) - 기본형을 제외한 나머지, 메모리 주소를 저장, (4byte => 4기가의 메모리를 다룰 수 있음)
자바의 데이터 타입 기초 타입 정수 타입 (byte, short, int, long)
문자 타입 (char)
실수 타입 (float, double)
논리 타입 (boolean)
참조타입 배열 타입
열거 타입
클래스 타입
인터페이스 타입

 

메모리 공간 크기 및 기본 값 (1비트 - 2진수 1자리(0,1) // 1바이트 - 8비트 (00001111))

분류 기초 타입 메모리 공간 크기 기본 값 값의 범위
정수 byte 8비트 0 -128 ~ 127
short 16비트 0 -32.768 ~ 32.767
int 32비트 0 -2,147,483,648 ~ 2,147,483,647
long 64비트 0L - 9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
문자 char 16비트 null 0('\u0000') ~ 65,535('\uFFFF')
실수 float 32비트 0.0f 약 ±3.4 x 10^-38 ~ ± 3.4 x 10^+38
double 64비트 0.0d 약 ±1.7 x 10^-308 ~ ±1.7 x 10^+308
논리 boolean 8비트 false true || false

 

기본형 데이터타입 정리(단위 바이트)

크기  1 2 4 8
정수형 byte short int long
실수형     float double
문자형   char(Unicode)    
논리형 boolean(true || false)      

 

float의 표현범위

자료형 저장가능한 값의 범위 정밀도 크기
bit byte
float 1.4E - 45 ~ 3.4E38 7자리 32 4
double 4.9E - 324 ~ 1.8E308 15자리 64 8

 

변수

의미

  • 프로그램은 기억 공간에 데이터를 보관하고, 각 기억 공간을 변수(Varialble)로 구분
  • 변수는 데이터를 담는 상자와 같은것으로 종류가 다양한데, 이를 구분하려고 데이터 타입을 사용 -=> 자바의 변수는 하나의 변수에 다양한 타입의 값을 저장할 수가 없음
  • 예를 들어 16기가 메모리 중에서 어떤 위치에 값 3을 저장하고 저장한 값 3을 가져울 것인지?
    • 변수가 메모리상의 번지를 참조하는 것임, 즉 메모리의 특정 번지에 붙여진 이름이 변수

변수

  • 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름

변수의 선언

  • 변수를 사용하려면 변수 선언이 필요
  • 변수 선언은 어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지를 결정하는 것
  • 변수에 최초로 값이 대입될 때 메모리에 할당되고, 해당 메모리에 값이 저장

리터럴

  • 프로그램 내부에서 값을 정의해 변수를 초기화할 수 있는데, 그 값이 리터럴임
  • 리터럴에 붙이는 접두사와 접미사(0b, 0x, L, F)

정수

  • 메모리 할당 크기와 저장되는 값의 범위가 다름
타입 메모리 크기 저장되는 값의 허용범위
byte 1byte 8bit -2^7 ~ (2^7 -1)  -128 ~ 127
short 2byte 16bit -2^15 ~ (2^15 - 1) -32,768 ~ 32,767
char 2byte 16bit 0 ~ (2^16 -1) 0 ~ 65535 (유니코드)
int 4byte 32bit -2^31 ~ (2^31 -1) -2,137,483,648,~2,137,.483,647
long 8byte 64bit -2^63 ~ (2^63 -1) - 9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • 정수 타입은 동일한 구조의 2진수에 메모리 n크기 만큼을 사용해 저장됨
int fifteen = 15; // 10진수
byte fifteen = 0b1111; // 2진수 15
short fifteen = 017; // 8진수 15
int fifteen = 0xF; // 16진수 15
long lightSpeed = 300000L; // L로 long 타입임을 명시

 

실수

  • double이 float 타입보다 정밀도가 높고 큰 실수를 저장함
double half = 0.5 ; // 일반 표기법
double half = 5E-1 ; // 지수 표기법으로 5x10^-1을 의미
float pi = 3.14159 ; // 오류
float pi = 3.14159F ; // F는 float 타입임을 명시
double pi = 3.14159;

 

문자

  • 문자 리터럴(하나의 문자를 작은 따옴표로 감싼 것)을 유니코드로 저장
char c = 'A'; // 문자
char c = 65; // 일종의 정수타입이기 때문에 65대입 가능
char c = '\u0041'; // 유니코드 값으로 대입
char c = "A"; // "A"는 문자가 아니라 문자열이므로 오류

 

논리

  • 두 가지 상태 값을 저장하는 경우에 사용
boolean stop = true;
boolean stop = false;
  • 조건문과 제어문의 실행 흐름을 변경하는데 사용
inx x = 10; 
boolean result = (x == 20); // 변수 x의 값이 20인가?
boolean result = (x != 20); // 변수 x의 값이 20이 아닌가?
boolean result = (x > 20); // 변수 x의 값이 20보다 큰가?
boolean result = (0 < x && x < 20); // 변수 x의 값이 0보다 크고 20보다 적은가?
boolean result = (x < 0 || x > 200); // 변수 x의 값이 0보다 적거나 200보다 큰가?

 

변수 사용

int power ;
power = 100; 

//혹은

int power = 100;

 

var 예약어

  • 자바 10부터 지원
  • 초깃값을 통하여 데이터 타입 추론 가능
  • 식별자로 사용 가능
var number = 100; // var는 정수를 나타낼 수 있는 int 타입으로 추론한다.
var korean = "한국"; // var는 문자열을 나타낼 수 있는 String 타입으로 추론한다.
var oops; // 오류

 

상수(constant) : 한 번만 값을 저장 가능한 변수

  • 프로그램 실행 중 변경할 수 없는 데이터를 담는 변수
  • 예를 들어 원주율 값 (3.14159)이나 빛의 속도(3x10^8 m/s)등
  • 상수 이름은 변수와 구분하려고 모두 대문자로 표기
  • 반드시 final 키워드로 지정

상수와 리터럴

  • 리터럴 : 그 자체로 값을 의미하는 것
  • 상수와 리터럴은 기존의 상수와 같음 즉 같은 개념임
  • 자바에서 상수를 한번만 값을 저장할 수 있는 변수라고 했기 때문에 구분하는것임
  • int score = 100; 여기서 100이 리터럴 , final int MAX = 200; 200은 리터럴 MAX는 상수

변수와 리터럴의 타입 불일치

  • 범위가 변수 > 리터럴 인 경우 OK
int i = 'A'; //int > char
long l = 123; // long > int
double d = 3.14f // double > float

 

  • 범위가 변수 < 리터럴 인 경우 Error 
int i =10_000_000_000; //int 범위 20억 넘기 때문임
long l = 3.14f // long < float, 8byte > 4byte 이지만 실수형이 저장범위가 더 넓음
float f = 3.14; // float < double , 접미사 f가 생략되면 double 임
  • byte, short 변수에 따라 int 리터럴 저장하는 경우 OK
byte b = 100; //byte 의 범위에 속하기 때문에 OK, 컴파일러가 (byte)100으로 자동 형변한해줌
byte b = 128; // -128 ~ 127 범위에 벗어나기 때문에 Error
int i = 100;
byte b = i; // Error , 반드시(byte) i로 형변환을 해서 대입해야함
byte b = 128; // -128 ~ 127 범위에 벗어나기 때문에 Error
char c = 'A';
char c = "A"; // Error
String s = "ABC";
/*
* String은 클래스이기 때문에 String s = new String("ABC"); 와 같이 적어야 하나
* 워낙 자주 쓰여서 String class는 String s = "ABC";와 같이 사용 가능
* : 참조 변수 s에 문자열의 주소가 저장되지만 변수 s에 "ABC"가 저장된다고 생각해도 됨
*/

char c = ''; //Error
String s = ""; // 빈 문자열
String s = "A" + "B" ; // 문자열의 결함
String s = "" + 7; //  ==> ""  + "&" => 문자열의 결합 => "7"
// "" + 7 + 7 과  7 + 7 + ""의 결과는 다름
  • 문자열 : 큰 따옴표("")로 감싼 문자들
  • 문자열 변수에 저장하려면 String 타입을 사용함
  • 이스케이프 문자 : 문자열 내부에 역슬래시(\)가 붙은 문자
  •  
이스케이프 문자  
\'' ''문자포함
\' ' 문자포함
\\ \ 문자포함
\u16진수 16진수 유니코드에 해당하는 문자포함
\ㅅ 출력시 탭만큼 띄움
\n 출력시 줄바꿈
\r 출력시 캐리지 리턴

 

타입 변환(형 변환)

  • 형변환 : 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
  • 자동 타입 변환 : 값의 허용범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때
    • 예외 : char 타입보다 허용범위가 작은 byte 타입은 char 타입으로 자동변환 될 수 없음
double d1 = 5 * 3.14; // 정수 5를 실수 5.0으로 자동 타입 변환
double d2 = 1 ; // 정수 1을 실수 1.0으로 자동 타입 변환
  • 표현범위가 좁은 타입에서 넓은 타입으로 형 변환하는 경우 값 손실이 없으므로, 두 타입 중에서 표현 범위가 더 넓은 쪽으로 형 변환
1byte 2byte 4byte 8byte 4byte 8byte
byte short / char int long float double

 

String 타입 변환하기

  • 문자열을 숫자로 변환
    • "3" => 3, Integer.parseInt("3")의 결과가 3으로 변환됨
    • "3.1" => 3.1, Double.parseDouble("3.1")의 결과가 double 리터럴 3.1으로 변환됨.
변환타입 사용 예
String => byte String str = "10";
byte value = Byte.parseByte(str);
String => short String str = "200";
short value = Short.parseShort(str);
String => int String str = "300000";
int value = Integer.parseInt(str);
String => long String str = "40000000000";
long value = Long.parseLong(str);
String =>float String str = "12.345";
float value = Float.parseFloat(str);
String => double String str = "12.345";
double value = Double.parseDouble(str);
String => boolean String str = "true";
boolean value = Boolean.parseBoolean(str);
  • 형 변환 연산자
변환 수식 결과
int => char (char) 65 'A'
char => int (int) 'A' 65
float => int (int)1.6f 1
int => float (float) 10 10.0f
  • 연산 중 필요하면 타입 범위가 넓은 방향으로 자동 타입 변환
double > float > long > int > short / char > byte

 

연산자

산술 연산자

  • 피 연산자의 데이터 타입에 따라 결과 값이 다른데, 연산할 두 피연산자의 데이터 타입이 다르면 큰 범위의 타입으로 일치시킨 후 연산 수행
  • 산술 변환 : 연산전에 피연산자의 타입을 일치시키는 것
    • 1) 두 피연산자의 타입을 같게 일치시킨다. (값 손실 최소하기 위해 보다 큰 타입으로 일치)
long + int => long + long = long
float + int => float + float = float
double + float => double + double = double
  • 2) 피연사자의 타입이 int 보다 작은 타입이면 int로 변환
byte + short => int + int = int
char + short => int + int = int
  • 나눗셉 또는 나머지 연산에서 좌측 연산자가 정수이고 우측 피연산자가 0일 경우 예외가 발생함. 무한대의 값을 정수로 표현할 수 없기 때문
    • NaN : Not a Number
    • infinity
  • 피연산자의 데이터 타입에 따라 결과 값이 다른데, 연산할 두 피연산자의 데이터 타입이 다르면 큰 범위의 타입으로 일치시킨 후 연산 수행
  • 논리 타입을 제외한 기초 타입을 피연사자로 사용. 단 & 연산자는 정수 타입만 사용
  • 덧셈 연산자는 문자열을 연결하는데도 사용. 문자열과 덧셈을 하는 데이터는 먼저 문자열로 변환한 후 서로 연결

비교 연산자

  • 비교 연산자는 논리 타입을 제외한 기초 타입에만 사용할 수 있지만 ==와 !=는 모든 기초 타입에 사용
  • 제어문인 조건문과 반복문에서 실행 흐름을 제어할 때 주로 사용함
연산자 사용 예  설명
== x == y x와 y는 같은가?
!= x != y x와 y가 다른가?
> x > y x는 y보다 큰가?
>= x >= y x는 y보다 크거나 같나?
< x < y x는 y보다 작은가?
<= x <= y x는 y보다 작거나 같나?
  • 문자열을 비교할 때는 동일 (==, !=) 연산자 대신 동등 연산(equals, !equals)를 사용해야함
  • 동일성 (identity, 두 객체가 완전히 같은 객체)
  • 동등성 (Equality, 두 객체가 저장된 값이 같음)

논리 연산자

  • 논리 연산자는 피연사나의 조건을 결합하여 true와 false를 조사하며, 논리타입에만 사용
  • 제어문인 조건문과 반복문에서 주로 사용함
a b !a a && b a || b a ^ b
false false true false false false
false true true false true true
true false false false true true
true true true true true false
  • 쇼트서킷(불필요한  연산을 생략함으로써 성능을 개선하는 연산 방식)

비트 시프트 연산자

  • 비트 연산자와 시프트 연사나는 정수 타입에만 사용
  • 비트 연산자의 종류
연산자 설명
& 두 비트가 모두 1일 때만 1이며, 나머지는 모두 0이다.     0101
&  0011
--------
    0001
두 비트가 모두  0일 때만 0이며, 나머지는 모두 1이다.    0101
|  0011
-------
   0111
^ 두 비트가 서로 다를 때는 1, 동일할 때는 0이다.     0101
^  0011
--------
     0110
~ 1을 0으로, 0을 1로 바꾼다. ~ 0011
--------
    1100
  • 시프트 연산자의 종류
연산자 a 연산자 b일 경우 설명 ( 예를 들어 , a << b)
<< a의 모든 비트를 왼쪽으로 b비트만큼 이동하며, 이동할 때마다 최하위 비트를 0으로 채운다. 곱셈 효과가 나타나기 때문에 산술적 왼쪽 시프트 (Arithmetic Left Shift)라고 한다.
>> a의 모든 비트를 오른쪽으로 b비트만큼 이동하며, 이동할 때마다 최상위 비트와 동일한 비트로 채운다. 나눗셈 효과가 나타내기 때문에 산술적 오른쪽 시프트( Arithmetic Right Shift)라고 한다.
>>> a의 모든 비트를 오른쪽으로 b비트만큼 이동하며, 이동할 때마다 최상위 비트를 0으로 채운다. 산술적 효과가 없기 때문에 논리적 오른쪽 시프트 (Logical Right Shift)라고 한다.

 

대입 연산자

  • 대입 연산자는 오른쪽에 있는 연산식의 결과 값을 왼쪽에 있는 변수에 대입
int power = 1000;
power = power + 1000;
연산자 설명
a += b a = a + b와 동일
a -= b a = a - b
a *= b a = a * b
a /= b a = a / b
a %= b a = a % b
a &= b a = a & b
a |= b a = a | b
a ^= b a = a ^ b
a >>= b a = a >> b
a <<= b a = a << b

 

부호 증감 연산자

  • 숫자를 나타내는 기초 타입에 사용하며 피연산자의 부호를 그대로 유지하거나 반전
  • 증감 연산자는 변수의 위치에 따라 의미가 다르다
    • 전위형(값이 참조되기 전에 증감)과 후위형(값이 참조된 후에 증감)
연산자 설명
++ ++X 연산 전 x값 증가(전위증가)
X++ 연산 후 x 값 증가(후위증가)
-- --X 연산 전 x 값 감소(전위감소)
X-- 연산 후 x 값 감소(후위감소)
  • 독립적으로 사용된 경우에는 전위형과 후위형 차이 없음

증감 연산자

  • 증감연산자가 도입된 이유는 코드, 연산식을 간단히 하기 위해였으나, 이해하기 어려울때는 증감연사자를 따로 떼어내면 이해가 쉬워진다.

조건 / 삼항 연산자

  • 조건 연산자 (? :)는 조건식이 true면 결과 값은 연산식1의 값이 되고 false면 결과 값은 연산식 2가된다.
조건식 ?  연산식 1 : 연산식 2
  • 총 3개의 피연산자를 가지므로 삼항 연산자라고 함
  • 조건 연산자도 쇼트서킷 로직을 이용하기 때문에 조건식에 따라 연산식1과 연산식2 중 하나만 실행
  • 우선순위 : 하나의 식 (expression)에 연산자가 둘이 이상 있을 때 어떤 연산을 먼저 수행할지 자동 결정하는것
설명
- x + 3 단항 연산자가 이항 연산자보다 우선순위가 높다. 그래서 x의 부호를 바꾼다음 덧셈이 수행된다. 여기서 '-'는 뺄셈 연산자가 아니라 부호 연산자이다.
x + 3 * y  
x + 3 > y - 2 비교 연산자 > 보다 산술 연산자 '+' 와 '-'가 먼저 수행된후 비교가 시작된다. 
x > 3 && x < 5 논리 연산자 '&&'보다 비교 연산자가 먼저 수행된후 논리 연산자가 수행된다.
result = x + y * 3 대입 연산자는 연산자 중 제일 우선 순위가 낮다 그래서 최종 값은 result에 저장
  • 결합 규칙 : 우선순위가 같은 연산자가 있을 때, 어떤 것을 먼저 적용할지를 정하는 것
    • 기본적으로 대부분 왼쪽에서 오른쪽이고 , 단항과 대입연산자만 오른ㅉ족에서 왼쪽이다.

연산자의 우선순위

  • 산술 > 비교 > 논리 > 대입 순서, 대입이 제일 후순이다.
  • 단항(1) > 이항(2) > 삼항(3)

결합규칙

  • 단항연산자와 대입연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
728x90

'CODING PRACTICE > Java' 카테고리의 다른 글

Java_Basic(3)_OOP(객체지향)  (5) 2025.08.06
Java__Basic(2)  (5) 2025.08.04
반응형

UPADE / DELETE

DROP TABLE movies;

CREATE TABLE movies(
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	title TEXT UNIQUE NOT NULL,
  released INTEGER NOT NULL CHECK(released >= 1800),
  overview TEXT,
  rating REAL CHECK(rating BETWEEN 0 AND 10),
  director TEXT,
  adult INTEGER CHECK(adult BETWEEN 0 AND 1)
);

INSERT INTO movies
	(title, released, rating, adult)
VALUES
	('ZZANGGU', 1900, 8.1, 0),
  ('x-mans',2000,7.5,0);
  
--UPDATE

UPDATE movies SET released = 1991; --모든 영화의 개봉일 1991이 된다.
UPDATE movies SET released = 2001 WHERE title = 'x-mans' ;
UPDATE movies SET director = 'who?' WHERE director IS NULL;

--DELETE

-- DELETE FROM movies; -- 모든 영화가 삭제된다.
DELETE FROM movies WHERE id = 1;

SELECT

-- SELECT
SELECT * FROM movies; -- 모든 movies의 데이터를 불러올 수 있다.

SELECT id, title, released, rating, adult  FROM movies WHERE title = 'ZZANGGU'; 

SELECT 
	id,
  title,
  released,
  rating,
  adult
FROM
	movies WHERE id = 2;
  
SELECT 
	id,
  UPPER(title) as upper_title ,
  released * 2 AS double_rating,
  REPLACE(rating, 7.5, 44) as replace_rate,
  adult
FROM
	movies WHERE id = 2;

 

WHERE

SELECT
	*
FROM
	movies
WHERE
-- 	title <> 'star' -- <> != 은 같다;
-- release_date > 2023;
-- release_date is null; -- null을 검색하기 위해서는 * = null 아니라 * is null / is not null로 검색해야한다.movies
-- 	original_language != 'en' AND release_date >2022
-- release_date BETWEEN 2020 AND 2022
-- genres IN ('Documentray' , 'Comedy')
-- title LIKE 'star'
-- title LIKE 'THE%' -- %는 와일드카드
-- title LIKE '%Star%'
title LIKE '___ter'
;

Conditional

SELECT
	title,
  CASE WHEN rating >= 7 THEN
  	'GOOD'
  WHEN rating < 7 THEN
  	'SOSO'
  ELSE
  	'NAH~'
  END AS string_rating
FROM
	movies
;

Order

SELECT
	*
FROM
	movies
WHERE
	title LIKE 'star wars%'
ORDER BY
	rating DESC --- ASC 오름차순 DESC 내침차순
;

 

OFFSET

SELECT
	*
FROM
	movies
LIMIT
	5 -- 몇개를 보여줄지
OFFSET
  5 -- 몇개를 넘어갈지
  -- 1*5
  -- 2*5
;
SELECT
	*
FROM
	movies
WHERE
	title LIKE '%star%'
ORDER BY
	rating	DESC
LIMIT
	15 -- 몇개를 보여줄지
OFFSET
  0 * 15 -- 몇개를 넘어갈지
;

 

GROUP BY

SELECT
	director,
-- 	SUM(revenue) as total_revenue
	AVG(revenue) as avg_revenue
FROM
	movies
WHERE
	director IS NOT NULL
  AND
  	revenue IS NOT NULL
GROUP BY 
	director
ORDER BY
-- 	total_revenue DESC
	avg_revenue DESC
;

HAVING

SELECT
	director,
-- 	SUM(revenue) as total_revenue
	AVG(revenue) as avg_revenue
FROM
	movies
WHERE
	director IS NOT NULL
  AND
  	revenue IS NOT NULL
GROUP BY 
	director
HAVING
	avg_revenue > 800000000
ORDER BY
-- 	total_revenue DESC
	avg_revenue DESC
;
728x90

'CODING PRACTICE > SQL' 카테고리의 다른 글

Basic__sqlite(1)  (0) 2025.02.25
반응형

테이블 생성

CREATE TABLE movies (
	title,
    released,
    overview,
    rating,
    director
);

 

테이블 삭제

DROP TABLE movies;

 

테이블에 데이터 삽입

-- 데이터값의 순서와 모든 데이터값이 존재함을 지켜야함

INSERT INTO movies VALUES (
  'movie_title',
  '1999',
  'good',
  '10/10',
  'who?'
);

 

-- 해당 데이터에만 값을 넣기
INSERT INTO movies (title) VALUES ('SINGLE_MOVIE_TITLE');
INSERT INTO movies (title,rating) VALUES ('SINGLE_MOVIE_TITLE no.2','8/10');

 

테이블 데이터 값에 타입지정 (SQLITE)

CREATE TABLE movies (
  title TEXT,
  released INTEGER, -- 1,2,3,4..
  overview TEXT,
  rating REAL, -- 1.1 , 2.8 , 3.6 ...
  director TEXT,
  adult INTEGER, -- sqlite에서 boolean을 넣기 위해서는 0,1 로 넣어 동작한다.
  forster BLOB, -- 데이터베이스에 이미지같은 파일을 저장하기 위해서는 BLOB을 사용한다.
);

 

테이블 데이터 값에 제약 넣기

CREATE TABLE movies (
  title TEXT UNIQUE NOT NULL,
  released INTEGER CHECK (released > 0), -- 1,2,3,4..
  overview TEXT NOT NULL CHECK(LENGTH(overview) < 100),
  rating REAL, -- 1.1 , 2.8 , 3.6 ...
  director TEXT NOT NULL,
  adult INTEGER NOT NULL DEFAULT 0 CHECK (adult = 0 OR adult = 1)
  -- adult INTEGER NOT NULL DEFAULT 0 CHECK (adult BETWEEN 0 AND 1)
);

INSERT INTO movies VALUES (
  'movie_title',
  1999,
  'good',
  9.7,
  'who?',
  1
);

INSERT INTO movies (title, overview, director, adult) VALUES 
	('SINGLE_MOVIE_TITLE','fine','thomas',0);

 

 

기본키(Primary Key)

기본키는 유니크해야하며 수정 불가해야한다.

기본키는 두가지 유형이 있는데 이는 기본기(Natural Primary Key) 대체 기본키 (Surrogate Primary key)가 있다.

자연 기본키는 테이블의 데이터와 논리적 관계를 갖는 기본키이다.

대체 기본키를 사용하는것을 추천

CREATE TABLE movies (
-- surrogate_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, --아래 데이터와 관련이 없다. 단지 고유식별자가 필요하기 때문이다.
  title TEXT UNIQUE NOT NULL PRIMARY KEY, -- natural키는 데이터와 연관이 있다.
.
.
.
);
728x90

'CODING PRACTICE > SQL' 카테고리의 다른 글

Basic_Sqlite(2)  (0) 2025.02.26
반응형

API 사용중 같은 값을 그룹화하면 좋을 것 같다는 생각을 간혹하게 되는데 이번 날씨 API를 사용하면서 그런생각이 들었다.

단기 예보를 불러오게 되면 거의 700개 이상의 object가 나온다.  각기 다른 날씨속성 12개의 카테고리로 한 줄씩 나오며 그 12개의 카테고리는 같은 예보시간이 들어있다. 

0: {baseDate: '20240922', baseTime: '2000', category: 'TMP', fcstDate: '20240922', fcstTime: '2100', …}
1: {baseDate: '20240922', baseTime: '2000', category: 'UUU', fcstDate: '20240922', fcstTime: '2100', …}
2: {baseDate: '20240922', baseTime: '2000', category: 'VVV', fcstDate: '20240922', fcstTime: '2100', …}
3: {baseDate: '20240922', baseTime: '2000', category: 'VEC', fcstDate: '20240922', fcstTime: '2100', …}
4: {baseDate: '20240922', baseTime: '2000', category: 'WSD', fcstDate: '20240922', fcstTime: '2100', …}
5: {baseDate: '20240922', baseTime: '2000', category: 'SKY', fcstDate: '20240922', fcstTime: '2100', …}
6: {baseDate: '20240922', baseTime: '2000', category: 'PTY', fcstDate: '20240922', fcstTime: '2100', …}
7: {baseDate: '20240922', baseTime: '2000', category: 'POP', fcstDate: '20240922', fcstTime: '2100', …}
8: {baseDate: '20240922', baseTime: '2000', category: 'WAV', fcstDate: '20240922', fcstTime: '2100', …}
9: {baseDate: '20240922', baseTime: '2000', category: 'PCP', fcstDate: '20240922', fcstTime: '2100', …}
10: {baseDate: '20240922', baseTime: '2000', category: 'REH', fcstDate: '20240922', fcstTime: '2100', …}
11: {baseDate: '20240922', baseTime: '2000', category: 'SNO', fcstDate: '20240922', fcstTime: '2100', …}
12: {baseDate: '20240922', baseTime: '2000', category: 'TMP', fcstDate: '20240922', fcstTime: '2200', …}
13: {baseDate: '20240922', baseTime: '2000', category: 'UUU', fcstDate: '20240922', fcstTime: '2200', …}
14: {baseDate: '20240922', baseTime: '2000', category: 'VVV', fcstDate: '20240922', fcstTime: '2200', …}
15: {baseDate: '20240922', baseTime: '2000', category: 'VEC', fcstDate: '20240922', fcstTime: '2200', …}
16: {baseDate: '20240922', baseTime: '2000', category: 'WSD', fcstDate: '20240922', fcstTime: '2200', …}
17: {baseDate: '20240922', baseTime: '2000', category: 'SKY', fcstDate: '20240922', fcstTime: '2200', …}
18: {baseDate: '20240922', baseTime: '2000', category: 'PTY', fcstDate: '20240922', fcstTime: '2200', …}
19: {baseDate: '20240922', baseTime: '2000', category: 'POP', fcstDate: '20240922', fcstTime: '2200', …}
20: {baseDate: '20240922', baseTime: '2000', category: 'WAV', fcstDate: '20240922', fcstTime: '2200', …}
21: {baseDate: '20240922', baseTime: '2000', category: 'PCP', fcstDate: '20240922', fcstTime: '2200', …}
22: {baseDate: '20240922', baseTime: '2000', category: 'REH', fcstDate: '20240922', fcstTime: '2200', …}
23: {baseDate: '20240922', baseTime: '2000', category: 'SNO', fcstDate: '20240922', fcstTime: '2200', …}
24: {baseDate: '20240922', baseTime: '2000', category: 'TMP', fcstDate: '20240922', fcstTime: '2300', …}
25: {baseDate: '20240922', baseTime: '2000', category: 'UUU', fcstDate: '20240922', fcstTime: '2300', …}
26: {baseDate: '20240922', baseTime: '2000', category: 'VVV', fcstDate: '20240922', fcstTime: '2300', …}
27: {baseDate: '20240922', baseTime: '2000', category: 'VEC', fcstDate: '20240922', fcstTime: '2300', …}
28: {baseDate: '20240922', baseTime: '2000', category: 'WSD', fcstDate: '20240922', fcstTime: '2300', …}
29: {baseDate: '20240922', baseTime: '2000', category: 'SKY', fcstDate: '20240922', fcstTime: '2300', …}
30: {baseDate: '20240922', baseTime: '2000', category: 'PTY', fcstDate: '20240922', fcstTime: '2300', …}
31: {baseDate: '20240922', baseTime: '2000', category: 'POP', fcstDate: '20240922', fcstTime: '2300', …}
32: {baseDate: '20240922', baseTime: '2000', category: 'WAV', fcstDate: '20240922', fcstTime: '2300', …}
33: {baseDate: '20240922', baseTime: '2000', category: 'PCP', fcstDate: '20240922', fcstTime: '2300', …}
34: {baseDate: '20240922', baseTime: '2000', category: 'REH', fcstDate: '20240922', fcstTime: '2300', …}
35: {baseDate: '20240922', baseTime: '2000', category: 'SNO', fcstDate: '20240922', fcstTime: '2300', …}

 

이것을 새로 배열을 구성하기 위해서 forEach문을 사용하였다.

일단 빈배열을 만들어주고 그 배열에 구성을 해주고 리턴해주면 된다. 

import type {
  INewForeCastType,
  IWeatherTodayTomorrowTypes,
} from "~/types/apiType";

export const createNewArr = ({
  data,
  newWeatherData,
}: {
  data: IWeatherTodayTomorrowTypes[];
  newWeatherData: globalThis.Ref<INewForeCastType[]>;
}) => {
  const newArr: INewForeCastType[] = [];
  data.forEach(({fcstTime, category, fcstValue}) => {
    let exist = newArr.find((entry) => entry.fcstTime === fcstTime);

    if (!exist) {
      exist = {
        fcstTime: fcstTime,
      };
      newArr.push(exist);
    }
    if (category === "POP") {
      exist.POP = fcstValue;
    }
    if (category === "PCP") {
      exist.PCP = fcstValue;
    }
    if (category === "PTY") {
      exist.PTY = fcstValue;
    }
    if (category === "REH") {
      exist.REH = fcstValue;
    }
    if (category === "SKY") {
      exist.SKY = fcstValue;
    }
    if (category === "SNO") {
      exist.SNO = fcstValue;
    }
    if (category === "TMP") {
      exist.TMP = fcstValue;
    }
    if (category === "UUU") {
      exist.UUU = fcstValue;
    }
    if (category === "VEC") {
      exist.VEC = fcstValue;
    }
    if (category === "VVV") {
      exist.VVV = fcstValue;
    }
    if (category === "WAV") {
      exist.WAV = fcstValue;
    }
    if (category === "WSD") {
      exist.WSD = fcstValue;
    }
  });
  return (newWeatherData.value = newArr);
};

 

 

728x90
반응형

ListView

리스트를 만들 수 있는 위젯이다. ListTile이라는 자식들을 둘수 있다. ListView.seperator로 줄로 나누어진 리스트도 만들수 있다.

ListTile

 ListTile(
            leading: Container(
              width: Sizes.size40,
              decoration: const BoxDecoration(
                  shape: BoxShape.circle, color: Colors.blue),
            ),
            title: const Text(
              "New Fallowers",
              style: TextStyle(fontWeight: FontWeight.w600),
            ),
            subtitle: const Text("Messages from followers will appear here"),
            trailing:
                const FaIcon(FontAwesomeIcons.chevronRight, size: Sizes.size16),
          ),

 

RichText

텍스트 내부에 택스트를 주기위한 방법 중 하나

RichText(
                text: const TextSpan(
                  text: "Account Updates:",
                  style: TextStyle(
                    fontWeight: FontWeight.w700,
                    color: Colors.black,
                  ),
                  children: [
                    TextSpan(
                      text: "Upload Longer Video",
                      style: TextStyle(fontWeight: FontWeight.normal),
                    ),
                  ],
                ),
              ),

 

반응형

Dismissible

리스트의 좌우 액션에 대한 내용

for (var notification in _notifications)
            Dismissible(
              key: Key(notification),
              onDismissed: (direction) => _onDismissed(notification),
              background: Container(
                alignment: Alignment.centerLeft,
                color: Colors.green,
                child: const Padding(
                  padding: EdgeInsets.symmetric(horizontal: 10),
                  child: FaIcon(
                    FontAwesomeIcons.checkDouble,
                    color: Colors.white,
                    size: Sizes.size32,
                  ),
                ),
              ),
              secondaryBackground: Container(
                alignment: Alignment.centerRight,
                color: Colors.red,
                child: const Padding(
                  padding: EdgeInsets.symmetric(horizontal: 10),
                  child: FaIcon(
                    FontAwesomeIcons.hammer,
                    color: Colors.white,
                    size: Sizes.size32,
                  ),
                ),
              ),
              child: ListTile(

 

RotationTrainsition & SlideTransition

animation을 주기 위해 animationController를 변수에 담아 init해주는데 보통 init을 하기위해 inintState(){}를 사용하는데 late를 사용하면 initState 내부에서 하지 않아도 된다.

Tween은 애니메이션의 정도를 담당한다. begin과 end값을 주고 animate를 해주면된다.

 

AnimatedModalBarrier

modal을 만들고 그에 따른 배경에 장막같은 것을 만들 수 있다.

if (_showBarrier)
            AnimatedModalBarrier(
              color: _barrierAnimation,
              dismissible: true,
              onDismiss: _toggleAnimation,
            ),

 

728x90

'Dart & Flutter' 카테고리의 다른 글

Flutter__008  (0) 2024.08.26
Flutter__007  (0) 2024.08.21
Flutter__006  (0) 2024.08.20
Flutter__005  (0) 2024.08.20
Flutter__004  (0) 2024.08.18
반응형

16진수

컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수로 표현하는 경우가 많다. 컴퓨터에서 데이터를 처리하기 우해 16진수를 사용할 때 장점이 있기 때문이다. 16진수와 일상생활에서 우리가 사용하느 10진수와 비교하면 차이를 알수있는데 16진수를 사요하면 10진수보다 2진수를 간단하게 나타낼수 있다. 16진수로 값을 표현하는 방법을 이해하고 나면 16진수,2진수 ,10진수를 변환하는 프로그램을 만들어볼 수 있다. 

 

10진수를 16진수로 바꾸어보기

JPG이미지 파일은 항상 255 216 255로 시작되고 이것은 10진수이다. 하지만 실제 컴퓨터에서는 10진수를 사용하지 않는다. 컴퓨터는 0과 1만 이해할 수 있기 때문이다.

10진수 255 216 255
2진수  1111 1111
= f   =  f  
1101 1000
=. d  =.  8
1111 1111
16진수 0xff 0xd8 0xff

 

4bit씩 16진수로 변환 후 맨 앞에 0x를 붙어주면 그 문자는 16진수가 된다.

 

16진수의 유용성

ASCII코드에 의해 'A,B,C'는 10진수로 65, 66, 67에 해당이 된다. 컴퓨터는 10진수를 이해할 수 없으므로 2진수로 표현해보면 "01000001 010000010 01000011' 이된다. 하지만 16진루로 표현하면 2진수로 표현해 냈을때보다 더간단해진다. 또한 컴퓨터는 8개의 비트가 모인 바이트단위로 정보를 표현한다. 2개의 16진수는 결국 1byte의 2진수로 변환되기 때문에 매우 유용하다

  A B C
10진수 65 66 67
2진수  0100 0001 0100 0010 0100 0011
16진수 0x41 0x42 0x43

 

메모리 주소

정수형 변수 n에 50이라는 값을 저장하고 출력한다했을 때 n이라는 값은 int이므로 4바이트 만큼 메모리에 자리를 차지하고 있을 것이다.

C언어에서는 메모리상 주소를 받기 우해 & 연산자를 사용하는데 이를 출력해보면 '0x7ffe00b3adbc' 따위의 값을 얻을 수 있고 이는 16진법으로 표기된 메모리주소이다. *&을 함께 사용하면 실제 값을 얻게 된다. c나 c++ 과 같은 저수준 프로그래밍 언어만 메모리 주소를 얻을 수 있다.

#include <stdio.h>

int main(void)
{
    int n = 50;
    printf("%i\n", *&n);
}

포인터

포인터 역할을 변수를 만들 수 있는데 

#include <stdio.h>

int main(void)
{
   int n = 50;
   int *p = &n;
   printf("%p\n", p);
   printf("%i\n", *p);
}

 

n에는 50이라는 값을 저장하고 이를 &연산자를 통해 메모리 주소값을 얻을 수 있으며 이를 다시 *p라는 실제값으로 변환 시킬수있는 포인터를 만들 수 있다.

728x90

+ Recent posts