끄적끄적 코딩
article thumbnail
Published 2023. 1. 16. 01:16
[Java] Java 기본 Java

Java란
썬 마이크로시스템즈의 제임스 고슬링과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어

Java의 특징
운영체제에 독립적으로 동작
객체 지향 언어 (캡슐화, 상속성, 다형성)
가비지 컬렉터를 통한 자동 메모리 관리
네트워크, 분산처리의 지원
멀티쓰레드 지원
동적 로딩의 지원

변수(Variable) 이란?
자료를 저장하기 위한 메모리 공간으로 타입에 따라 크기가 달라짐
메모리 공간에 값을 할당 후 사용

기본형 (primitive type)
미리 정해진 크기의 Memory Sisze로 표현
변수 자체에 값 저장

참조형 (reference type)
크기가 미리 정해질 수 없는 데이터의 표현
변수에는 실제 값을 참조할 수 잇는 주소만 저장


기본형의 크기

https://math-coding.tistory.com/156

* Java는 semi boolean을 처리 하지 않음 (javascript는 처리함)


형 변환 (Type casting)
변수의 타입을 다른 타입으로 변환하는 것
기본형은 기본형끼리, 참조형은 참조형끼리 형 변환 가능
- short와 char는 호환이 안됨 (char = unsigned, short = signed)
- boolean은 다른 기본형과 호환되지 않음
- 기본타입은 참조형과 형 변환을 위해서 Wrapper 클래스 사용

묵시적 형변환
큰 타입에 작은 타입 데이터를 넣는 것

명시적 형변환
작은 타입에 큰 타입 데이터를 넣기 위해 명시적 형변환이 필요
데이터 손실 가능성이 있음

int c
byte a
c = a //(묵시적 형변환)
a = c //(불가능)
a = (byte)c //(명시적 형변환) (데이터 손실 가능)
float f1 = 2.0f;   // float 소수점 사용 시 형변환 필요
float f2 = (float)2.0
double d = 2.0;    // double은 필요하지 않음
d=f // 묵시적 형변환
f=d // 불가능 
f = float(d)  // 명시적 형변환
long l = 8
float f = 2
f = l

long은 64bit, float은 32bit이지만 이진수 처리방식이 다르며
float이 표현할 수 있는 데이터 범위가 넓으므로  float에 정수형인 long을 넣을수 있음

byte < short, char < int < long < float < double
컴퓨터는 2의보수만 사용


정수에서 사용 가능한 진수 변환

int c = 010;  // 8    8진수
        0x10; // 16  16진수
        0b10; // 2    2진수

연산자



단항연산자

a++ // 연산을 실행하고 나서 ++처리가 됨
++a // 연산을 실행하기 전에 ++ 처리가 됨


삼항연산자
코드의 길이를 줄일 수 있는 조건문
컴파일 속도가 빨라지는 것은 아님
삼항 연산자를 중복해서 처리할 경우. 가독성이 떨어질 수 있음


(조건) ? (참) : (거짓)

a>b ? c=a : c=b;



쇼트서킷
=> 짧은 단위에 논리 연산, 앞에서 false가 되버리면 뒤에 연산을 안함

if(false || ++a > 20){} // 11 
if(false && ++a > 20){} // 10

아래의 값은 false에서 이미 쇼트서킷이 발생해 뒤의 ++a부분이 실행되지 않음


비트 연산
비트 연산을 사용하면 짧은 단위에 논리 연산(쇼트서킷)이 안됨

if(false & ++a > 20){} // 11

& - AND 연산자
| - OR 연산자
^ - XOR 연산자
! - NOT 연산자


시프트 연산
비트 값을 주어진 숫자만큼 부호 방향으로 이동시키는 연산자
ex) <<, >>, >>>
<<, >> (산술적 시프트 연산자)
>>> (논리적 시프트 연산자)

s >> 1; // 산술적 시프트 연산자 (s / 2)
k << 35; // 메모리크기만큼 모듈러 연산해서 계산함 (k << (35%32))


양수일때는 >>, >>> 차이없음
>>> = 비트만 이동하므로 음수연산때 왼쪽에 0이들어옴


자바의 연산 단위는 기본 int

byte b1, b2, b3
b1 = b2 + b3;  // int로 처리해서 타입이 맞지않아 들어가지 않음


int, float 계산시 단위는 float
int 타입 위로는 큰단위를 따라감

조건문 (Conditional Statement)
if문
조건에 맞는 경우 해당 코드를 실행하며,
if문에 해당하지 않으면 차례대로 else if문의 조건을 확인합니다.
모든 조건이 해당하지 않을 경우 else문이 실행됩니다.

if(a == 1){
  System.out.println("a는 1입니다.");
} else if(a == 2){
  System.out.println("a는 2입니다.");
} else {
  System.out.println("a는 1과 2가 아닙니다.");
}

Switch문
조건에 들어간 변수의 값에 따른 케이스를 지정해서 해당 코드를 실행합니다.
모든 케이스에 맞지 않다면 default 코드가 실행됩니다.
조건에 들어올 수 있는 데이터 타입 : int, byte, short, string

switch(a){
  case 1:
    System.out.println("a는 1입니다.");
    break;
  case 2:
    System.out.println("a는 2입니다.");
    break;
  default:
    System.out.println("a는 1과 2가 아닙니다.");
    break;
}

 

* if문 else if를 쓸때는 같은 조건의 변수를 사용할 때 사용
* 아닐 경우에는 새로운 조건으로 if문을 정의
* else if의 경우 switch 문으로 대체 가능 해야 함
* 부등호 일 경우 if문 많이 사용 그 외에는 switch문 많이 사용

반복문
for문
for( 변수 초기화 ; 조건 ; 증감식 ) 형태로 이루진 반복문입니다.

for(int i=0; i<n; i++){
  System.out.println(i);
}


while문
while(조건) 형태로 이루어졌습니다.

while(count > 0){
  System.out.println("카운트 다운 : " + count);  
  count--;
}

* 반복의 끝을 알고 있는 경우 주로 for문을 사용
* 반복이 언제 끝날지 알 수 없는 경우 주로 while문을 사용

배열
동일한 타입의 데이터 0개 이상을 하나의 연속된 메모리 공간에서 관맇나느 것
요소에 접근하는 속도가 매우 빠름
한번 생성하면 크기 변경 불가

int[] jum = new int[3]; // 선언과 생성
int[] jum = new int[]{10,30,20,20,20,100};
int[] jum = {10,30,20,20,20,100}; // 같은 줄에 쓸 경우 new int[] 생략 가능


메서드 호출 방식
Call by Value와 Call by Reference 방식이 있는데 Java는 Call by Value방식을 지원

Call by Value
메서드를 호출 할 때 값을 넘겨주는 방식
메서드를 호출하는 호출자의 변수와 호출 당하는 수신자의 파라미터는 복사된 서로 다른 변수 (깊은 복사)

public static void main(String[] args){
  int a = 10;
  System.out.println(a);
  func(a);
  System.out.println(a);
}
static void func(int x) {
  System.out.println(x);
  x = 20;
  System.out.println(x);
}
// 10
// 10
// 20
// 10

Call by Reference
참조 주소를 직접 전달하는 방식
참조를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 완전히 동일한 변수 (얕은 복사)

public static void main(String[] args){
  int[] arr = {1,2,3};
  System.out.println(arr[1]);
  func(arr);
  System.out.println(arr[1]);
}
static void func(int[] brr) {
  System.out.println(brr[1]);
  brr[1] = 99;
  System.out.println(brr[1]);
}
// 2
// 2
// 99
// 99

깊은 복사, 얕은 복사

 int[] brr; 
 int[] crr; 
 brr = crr;

=> 얕은 복사, 같은것을 가리키게만 한다.  두 변수가 같은 값을 참조하고 있음

brr[0] = crr[0];

=> 깊은 복사, 값을 가져온다. 두 변수가 각각의 같은 값을 가짐



주석

// 한줄 주석
/* */ 여러 줄 주석
/** */ 자바 독스를 작성하는 용도로 사용

데이터 입력

import java.util.Scanner;
...
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
...

데이터 출력

System.out.println("c : " + c);
System.out.println(String.format("c : %d", c));
System.out.printf("c : %d %n", c)); // %n = 줄바꿈

 

검색 태그