💡BE/JAVA

자바의 기본 문법

뇌 리셋은 기본이지 2023. 11. 10. 02:05

변수와 메서드

변수

변수는 데이터를 저장하기 위한 메모리 공간에 대한 이름으로 저장할 데이터의 크기를 알아야 필요한 공간을 확부할 수 있다. 따라서 적절한 자료형을 사용하는 것은 매우 중요하다.

 

다만, 객체지향 프로그램 언어에서는 클래스 타입을 자료형으로 사용할 수 있으며, 최근에 나오는 언어들의 경우 메모리 공간의 크기를 계산하기 위한 용도라기 보단 타입을 구분하는 개념으로 접근하고 있다.

 

자바의 경우 원시 자료형클래스 타입을 모두 지원하고 있으며, 원시 자료형에 대한 클래스 타입들은 랩퍼 클래스라고 한다.

변수 선언 방법

[접근 제어자] 타입 변수명;
private String name;
  • 접근제어자 : 변수의 접근 범위를 지정
  • 타입 : 자료형으로 자바는 명시적으로 타입을 지정해야 한다.
  • 자료형에는 원시자료형과 객체형이 있으며, 객체 타입의 변수는 참조변수라고 한다.
int number = 10;		//원시자료형 정수 타입
String str = "string";		//객체타입 문자열 타입
Member member = new Member();	//객체타입 Member 클래스 타입

기본자료형( Primitive type )

숫자는 정수, 실수가 있고, 그 외 문자, 논리형이 있다. 객체가 아니면서 메서드가 없는 7가지 데이터 타입을 가지고 있다. 기본적으로 숫자형 데이터 타입이다.

 

각 자료형의 명칭과 크기 등은 다음과 같다.

타입 자료형 크기 범위 설명
정수 byte 1byte -128 ~ 127 가장 작은 단위
8bit로 구성된 1byte를 기본으로 한다.
short 2byte -32768 ~ 32767 음수를 포함한 2바이트 크기의 자료형
작은 데이터 처리에 적합하다.
int 4byte -2147483648 ~ 2147483647 정수의 기본 자료형
충분한 크기가 아님에 주의하자.
long 8byte -9223372036854775808 ~ 9223372036854775807 충분한 숫자 값이 필요한 경우 사용
문자 char 2byte 0 ~ 65535
16비트 유니코드 문자 데이터
음수를 포함하지 않는 unsigned 자료형
문자 표현에 적합하다.
실수 float 4byte 1.4E-45 ~ 3.4028235E38 실수형의 기본형이 아니므로 숫자 뒤에 f를 붙여 사용한다.
double 8byte 4.9E-324 ~ 1.7976931348623157E308 실수형의 기본 자료형
논리 boolean 1byte true or false 논리형으로 참과 거짓을 표현한다.
  • 자바에서는 유니코드를 기본으로 지원하기 때문에 문자 처리에 2바이트가 필요하다.
  • 문자 출력은 유니코드 번호에 등록된 문자가 출력되므로 실제 char 에 저장되는 값은 유니코드 번호(숫자값)이다.
  • JVM에서 피연산자를 4바이트 단위로 처리하기 때문에 int보다 작은 자료형의 값을 연산하는 경우 자동으로 int로 변환되어 처리된다.
  • 정수값을 long형으로 처리하기 위해서는 뒤에 L/l를 붙여줘야 한다.
//Long
long lVar1 = 2000000;
long lVar2 = 20000000000L; //L을 붙혀야 long type으로 본다.
  • float형을 지정하기 위해서는 실수값 뒤에 F/f를 붙여줘야 한다.
//float, double

float var1 = 3.14f;
double var2 = 3.14; // float var2 = 3.14;로 적으면 기본 double로 인식

float var3 = 0.132546465478f; //자동 반올림이 되어 값을 출력함
double var4 = 0.156465154; // 기재한 값 그대로 출력

System.out.println("var3 : " + var3); //0.13254647
System.out.println("var3 : " + var4); //0.156465154

double var6 = 3e6;
float var7 = 3e6F;
float var8 = 3e-3F;

System.out.println("var6 : " + var6); // 3000000.0
System.out.println("var7 : " + var7); // 3000000.0
System.out.println("var8 : " + var8); // 0.003

 

참조자료형( Reference type )

참조자료형은 기본자료형을 제외한 모든 자료형이며, 객체의 주소를 저장하는 타입이다. 쉽게 말해 자바의 인스턴스를 가리킬 수 있는 자료형이다. 문자열, 배열, 열거형, 상수, 클래스, 인터페이스 등이 있다.  가장 친근한 String 또한 참조 자료형에 속한다(클래스).

  • 예시
//값이 없는 텅 빈 상태의 배열
String[] strArray = new String[3];

//배열 인덱스마다 값을 추가
strArray[0] = "abc";
strArray[1] = "abc";
strArray[2] = new String("abc");  //new를 통해 힙 영역에 또 다른 번지수 생성

//String의 주소값 비교
System.out.println(strArray[0] == strArray[1]);
System.out.println(strArray[0] == strArray[2]); //2번은 new를 통해 새로운 번지수를 받아 생성되어 false라는 결과값이 나온다.

//String의 데이터 비교
System.out.println(strArray[0].equals(strArray[2]));


/* 콘솔
    true
    false
    true
*/

자바 변수 유형

public class Example {
	// 멤버 변수, 인스턴스 변수
    int num1;
    
   // 멤버 변수, 클래스 변수
   static int num2;
   
   // 매개변수
   public void printName(String name) {
   		//지역변수
        String prtMag = name + " Hello";
        Ststem.out.println(prtMsg);
   }
   
   public static void main(String[] args) {
   		// 인스턴스 생성
        Example ex = new Example();
        
        // 인스턴스 변수 사용
        ex.num1 = 100;
        
        // 클래스 변수 사용
        Example.num2 = 50;
        
        // 인사로 매개변수에 값을 전달
        ex.printName("홍길동");
        
        System.out.printf("%d, %d", ex.num1, Example.num2);
   }
}

프로그램 코드내에서 변수의 위치에 따라 몇 가지 유형으로 변수를 구분할 수 있다.

  • 멤버변수(Member variable)
    • 클래스부에 선언된 변수들로 객체의 속성에 해당된다.
    • 인스턴스 변수와 클래스 변수로 구분 된다.
  • 인스턴스변수(Instance variable)
    • 클래스가 인스턴스로 생성할 때 초기화 되는 변수.
    • 인스턴스를 통해서만 접근할 수 있다.
  • 매개변수(Parameter)
    • 메서드에 인자로 전달되는 값을 받기 위한 변수.
    • 메서드 내에서는 지역변수처럼 사용된다.
  • 지역번수(Local variable)
    • 메서드 내에서 선언된 변수.
    • 멤버변수와 동일한 이름을 가질 수 있으며 지역변수가 우선이다.
  • 클래스변수(Class variable)
    • static으로 선언된 변수.
    • 인스턴스 생성없이 클래스이름.변수명으로 사용이 가능하다.
    • main() 메서드에서 참고 가능하다.

메서드

메서드는 특정 객체의 동작이나 행위를 정의한 것으로 클래스의 주요 구성요소이다.

메서드 선언 방법

[접근제어자] 리턴타입 메서드명([인자..]) {
	...
}

public String name(String name) {
	...
}
  • 접근제어자 : 메서드의 접근 범위를 지정
  • 리턴 타입을 반드시 명시해야 하며, 리턴이 없는 경우 void를 사용한다.

메서드 오버로딩(Overloading)

  • 자바의 한 클래스 내에 일미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의할 수 있다.
  • 메서드의 이름이 동일하고 매개변수의 개수나 타입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.
class OverloadingTest {
	public static void main(String[] args) {
    	OverloadingMethods om = new OverloadingMethods();
        
        om.print();				//오버로딩1
        Sysyem.out.println(om.print(3));	//오버로딩2
        					//3
        om.print("Hello!");			//오버로딩3
        					//Hello!
        System.out.println(om.print(4, 5);	//오버로딩4
        					//45
    }
}

class OverloadingMethods {
	public void print() {
    	System.out.println("오버로딩1");
    }
    
    String print(Integer a) {
    	System.out.println("오버로딩2");
        return a.toString();
    }
    
    void void print(Stirng a) {
    	System.out.println("오버로딩3");
        System.out.println(a);
    }
    
    String print(Integer a, Integer b) {
    	System.out.println("오버로딩4");
        return a.toString() + b.toString();
    }
}

가변 인자(Variable arguments)

pbulic PrintStream printf(String format, Object... args) {...}
  • 인자의 수가 유동적인 메서드
  • String... msg(타입...변수명)와 같이 가변인자를 사용한다.
  • 대표적인 예로는 Printstream 클래스의 printf()가 있다.
  • 위와 같이 가변인자 외에도 매개변수가 더 있다면 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다. 그렇지 않으면 켐퍼알 에러가 발생한다. 그 이유는 가변인지인지 아닌지를 구별할 방법이 없기 때문이다.
public class Main {
    public static void main(String[] args) {
    	// 출력 : 010-1234-5678 gongrildong
        System.out.println(varargsEx("010-1234-5678","hong", "ril", "dong"));
        // 출력 : 010-5678-1234 kimphil
        System.out.println(varargsEx("010-5678-1234", "kim", "phil"));
    }

    static String varargsEx(String mail, String... str) {
        mail += " ";
        for (String s : str) {
            mail += s;
        }
        return mail;
    }
}

// 컴파일 에러 예시
public class Main {
    public static void main(String[] args) {
        System.out.println(varargsEx("hong", "ril", "dong", "010-1234-5678"));
        System.out.println(varargsEx("kim", "phil", "010-5678-1234"));
    }
    
    // 컴파일 에러 발생부분
    static String varargsEx(String... str, String mail) {
        mail += " ";
        for (String s : str) {
            mail += s;
        }
        return mail;
    }
}

생성자 메서드(Construction method)

  • 클래스가 인스턴스될 때 호출되는 메서드.
  • 클래스 실행 시 초기화 작업을 수행한다.
  • 메서드 오버로딩에 의해 여러 생성자가 있을 수 있다.

연산자(Operator)

연산자는 프로그램에서 변수의 값들을 계산하기 위해 사용한다. 사칙연산, 대입연산, 비트연산, 논리연상, 관계연산 등이 있다.

사칙연산

숫자 데이터를 이용해 기본적인 수학 연산을 수행한다.

사칙 연산자 의미 사용 예 결과
+ 덧샘 4 + 2 6
- 뺄샘 4 - 2 1
* 곱샘 4 * 2 8
/ 나누기 몫 4 / 2 2
% 나누기 나머지 8 % 3 2

 

대입연산

변수에 값을 대입하기 위한 연산자로 축양형단항 연산자 등이 포함되어 있다.

 

대입 연산자 의미 사용 예 결과
= 변수에 값을 할당 ex = 10; 10
+= 변수에 값을 더하고 변수에 할당 ex += 2; 12
-= 변수에 값을 빼고 변수에 할당 ex -= 2; 8
/= 변수에 값을 나누고 몫을 변수에 할당 ex /= 3; 3
%= 변수에 값을 나누고 나머지를 변수에 할당 ex %/ 3; 1
++ 변수에 1을 더한다. ex++; 11
-- 변수에 1을 뺀다. ex--; 9
단항 연산자는 ++, --가 있다. 이 것은 변수명 앞 혹은 뒤에 사용할 수 있다. 변수 앞에 사용하는 경우 값을 먼저 증/감시킨 후 변수에 대입하고, 변수 뒤에 사용하는 경우 현재 변수 값을 사용한 다음 증/감 시킨 값을 대입하게 된다.

비트연산자

일반적으로 사용하는 10진수 혹은 문자에 대한 연산이 아닌 비트 단위의 연산에 사용되는 연산자이다.

연산에 사용되는 값은 long, int, short, char, byte 등이 될 수 있으며, 10진수 데이터를 비트(2진수)로 변환한 데이터를 가지고 연산을 수행하게 된다.

비트 단위의 데이터를 다루는 경우(센서 등 기계장치로부터 발생하는 데이터 등) 유용하게 사용할 수 있으며, 비트쉬프트, XOR 등의 연산을 통해 간단한 암호화 처리등에 사용할 수 있다.

 

비트 연산자 의미 사용 예 결과
& 비트 AND 연산자
2진수로 표현된 두 비트가 1일 경우에만 연산 결과가 1로 표현 됨. 즉, 0 1 = 0, 1 1 = 1
a & b a(40):   0010 1000
b(122): 0111 1010
result:   0010 1000
| 비트 OR 연산자
2진수로 표현된 두 비트 중 하나라도 1일 경우 연산 결과가 1로 표현 됨. 즉, 1 0 = 1, 0 1 = 1
a | b a: 0010 1000
b: 0111 1010
r:  0111 1010
^ 비트 XOR 연산자
2진수로 표현된 두 비트가 1 1일 경우 연산 결과가 1로 표현 됨. 즉, 1 1이면 결과는 0이다.
a ^ b a: 0010 1000
b: 0111 1010
r:  0101 0010
~ 비트 NOT 연산자
2진수로 표현 했을 때, 0은 1로, 1은 0으로 바뀐다. 논리 부정 연산자 ' ! ' 와 유사하다.
ex) ~10 = -11
a ~ b a: 0010 1000
r:  1101 0111
>> right shift 연산자
피연산자의 각 자리(2진수로 표현했을 때)를 오른쪽으로 이동 됨.
a » 2 a: 0010 1000
r:  0000 1010
<< left shift 연산자
피연산자의 각 자리(2진수로 표현했을 때)를 왼쪽으로 이동 됨.
a « 2 a: 0010 1000
r:  1010 0000
  • 예시 표
비트1 비트2 비트1 & 비트2 비트1 | 비트2 비트1 ^ 비트2 ~ 비트 1 ~ 비트 2
0 0 0 0 0 1 1
0 1 0 1 1 1 0
1 0 0 1 1 0 1
1 1 1 1 0 0 0
public class Operator2 {
    public static void main(String[] args) {
        int num1 = 50;
        System.out.printf("정수값 num1 : %d, %s\n", num1, Integer.toBinaryString(num1));		

        int result1 = num1 >> 1;
        System.out.printf("num1 >> 1 : %d, %s\n", result1, Integer.toBinaryString(result1));

        int result2 = num1 << 1;
        System.out.printf("num1 << 1 : %d, %s\n", result2, Integer.toBinaryString(result2));

        System.out.println("------------------");

        int pwd = 123456;
        int encPwd, decPwd;
        int key = 0x1A253B65;
      
        System.out.println("암호화 전 비밀번호 : "+pwd);
        
        encPwd = pwd ^ key;
        System.out.println("암호화 후 비밀번호 : "+encPwd);
        
        decPwd = encPwd ^ key;
        System.out.println("복호화 후 비밀번호 : "+decPwd);
    }
}

/*  결과
    정수값 num1 : 50, 110010
    num1 >> 2 : 25, 11001
    num1 << 2 : 100, 1100100
    ------------------
    암호화 전 비밀번호 : 123456
    암호화 후 비밀번호 : 438622501
    복호화 후 비밀번호 : 123456
*/

 

Integer.toBinaryString() : 10진수를 2진수로 바꿔주는 역할
💡toOctalString  - 8진수
💡toHexString    - 16진수

논리 연산자

true 혹은 false를 반환하는 연산자로 여러 조건을 만족하는지 체크하기 위한 용도로 if문 등에 사용된다.

논리 연산자 의미
&& AND(그리고), 양쪽이 모두 참일 경우에만 true를 return
|| OR(또는), 양쪽 중 한 쪽이 참여도 true를 return
! NOT(부정), 조건식의 결과를 반대로 바꾸어 주는 단항연산자
  • 예시 표
A B A && B A || B !A
true true true true false
true false false true false
false true false true true
false false false false true

관계 연산자

왼쪽과 오른쪽의 피연산자를 비교한 결과를 true, false로 리턴하는 연산자이다. 보통 if, while문 등에서 수행 조건을 체크하기 위해 사용된다.

관계 연산자 의미 사용 예 결과
> 크다 5 > 10 false
>= 같거나 크다 10 >= 5 true
< 작다 5 < 2 true
<= 같거나 작다 10 <= 15 false
== 같다 5 == 5 true
!= 같지 않다. 5 != 7 true

조건문

💡사전지식 : char는 문자열 하나만을 담으며 작은 따옴표로 표현된다.

조건문은 조건식의 결과에 따라 블록 실행 여부가 결정된다. 종류로는 if, switch문이 있다. 해당 글에선 간단하게 집고 넘어간다. 더욱 자세한건 따로 글을 작성할 예정이다.

if문

// 방법 1
if(조건식) {
	실행문;
    ...
} 

// 방법 2
if(조건식) 실행문;

실행문이 하나라면 블록 기호 {}를 생략할 수 있다(방법2). 조건식에는 true, false 값을 반환하는 연산식이나 boolean 변수가 올 수 있다. 참이면 실행문을 실행하고, 거짓이면 실행하지 않는다.

switch문

// 백준 9498 문제
public class Main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = a/10;
		
		switch(b) {
                case 10:
                case 9:
                    System.out.println("A");
                    break;
                case 8:
                    System.out.println("B");
                    break;
                case 7:
                    System.out.println("C");
                    break;
                case 6:
                    System.out.println("D");
                    break;
                default:
                    System.out.println("F");
		}
	}
}

switch문은 각 case마다 break가 없다면 조건을 충족한 케이스 이후에는 판별하지 않고 모두 실행시킨다. default는 if문의 else와 비슷한 기능이라고 생각하면 될 듯 하다.

반복문

반복문에는 for, while, do-while문이 있다. for문은 반복횟수를 알고 있을 때, while문은 반복 조건 위주에 따라 반복할 때 사용된다. 조건문과 동일하게 간단하게 집고 넘어간다.

for문

for(1 초기화식 ; 2 조건식 ; 4 증감식) {
	3 실행문;
    ...
}

1. 초기화식 : 반복 횟수를 제어하는 변수 초기화식이 제일 먼저 실행된다.

2. 조건식 : 조건식을 검사해서 참이면 3. 실행문을 실행. 거짓이면 for문을 종료한다.

4. 증감식 : 3 실행문이 모두 실행되면 4 증감식을 실행한 후 다시 2 조건식을 검사한다. 참이면 3 실행문을 또 다시 실행하고, 다시 4 증감식을 실행을 반복한다.

while문

조건식이 참일 경우에 계속해서 반복한다. 조건식에는 주로 논리 연산식이 온다. 거짓일 경우 반복을 멈추고 while 블록을 종료한다.

while(1 조건식) {
	2 실행문 <반복영역>
}

1. 조건식 (true)  : 2. 실행문을 실행한 후 다시 1. 조건문을 검사한다.

1. 조건식 (false) : while 문을 종료한다.

do-while문

블록 내부에 한 번 실행 후 조건식을 검사하여 반복 여부를 결정한다.

do {
  1 실행문;
} while (2 조건식);

while( ) 뒤에는 반드시 세미콜론( ; )이 붙어야 한다.

1. 실행문이 우선 수행한 후, 2. 조건식을 검사한다.

조건이 true이면 1 실행문을 반복 수행하고, false면 do-while문을 종료한다.

reference

https://dinfree.com/lecture/language/112_java_2.html#m1

https://pool-cover-73b.notion.site/480a3da2bedd4ec19df7a88fd0076e10?pvs=4]

https://hyoje420.tistory.com/14

https://velog.io/@minseojo/Java-%EA%B0%80%EB%B3%80%EC%9D%B8%EC%9E%90-varargs

https://velog.io/@yeoonnii/JAVA-%EB%85%BC%EB%A6%AC%EC%97%B0%EC%82%B0%EC%9E%90%EB%B9%84%ED%8A%B8%EC%97%B0%EC%82%B0%EC%9E%90

https://kephilab.tistory.com/34

https://velog.io/@rlafbf222/JAVA-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC#15-%EC%8A%A4%ED%8A%B8%EB%A6%BC-stream

관련자료 보기

 

반복문(for, 향상 for, forEach(), while, do-while)

반복문 반복문에는 for문, while문이 있다. 반복문은 어떤 작업을 반복적으로 실행하고 싶을 때 사용하여 제어문 처음으로 되돌아가 반복 실행하는데 이것을 루핑(looping)이라고 한다. for문 for문은

eun-developer.tistory.com

 

'💡BE > JAVA' 카테고리의 다른 글

반복문(for, 향상 for, forEach(), while, do-while)  (0) 2023.11.10