[포스코x코딩온] 웹개발자 풀스택 과정 16주차 | Java 조건문, 반복문, 메소드

구준희·2023년 10월 21일
0

[포스코x코딩온]교육

목록 보기
34/40
post-thumbnail
post-custom-banner

Java

자바란?

썬 마이크로시스템즈에서 1995년에 개발한 객체지향 프로그래밍 언어이다.

특징

1. 객체지향 언어

  • 객체지향 프로그래밍(OOP, Object Oriented Programming)이란 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결하여 전체 프로그램을 완성하는 것
  • 객체지향 언어의 특징인 캡슐화, 상속성, 다형성을 지원한다.

2. 높은 이식성

  • 이식성이란 서로 다른 실행환경을 가진 프로그램을 옮겨 실행할 수 있는 것을 말한다.
  • 자바는 자바 실행환경(JRE)이 설치 되어 있는 모든 운영체제에서 실행이 가능하다.

3. 인터프리터 언어

  • 컴파일 언어인 동시에 인터프리터 언어이다.
  • 시스템에 무관한 2진 파일을 만듬으로써 자바는 컴파일 언어에 가까운 속도와 시스템 독립성을 얻을 수 있다.

4. 메모리 자동관리

  • C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 한다.
  • 자바는 개발자가 직접 메모리에 접근을 할 수 없으며 메모리는 자바가 직접 관리한다.
  • 객체 생성시 자동으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 객체를 제거한다.

5. 쉬운 멀티 스레드 구현

  • 운영체제에 따라 멀티 스레드를 구현하는 방법이 다르지만, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하므로 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다.

6. 동적로딩 지원

  • 실행시에 모든 클래스가 로딩되는 것이 아니라 필요한 시점에 클래스를 로딩하여 사용할 수 있다.
  • 애플리케이션의 변경사항이 발생해도 비교적 적은 작업만으로도 처리할 수 있는 유연한 애플리케이션을 장성할 수 있다.

단점

  • 자바는 실행을 위해 자바 가상 머신을 거쳐야 하므로, 다른 언어에 비해 실행속도가 느리다.
  • 자바는 예외처리가 잘 되어 있지만, 개발자가 일일이 처리를 지정해 줘야 한다는 불편함이 있다.
  • 자바는 다른 언어에 비해 작성해야 하는 코드가 긴 편이다.

변수

변수의 이름 생성규칙

  • 자바에서는 변수뿐만 아니라 클래스, 메소드 등의 이름을 짓는데 반드시 지켜야 하는 공통된 규칙이 있다.
  1. 변수의 이름은 영문자(대소문자),숫자,언더스코어(_),달러($)로만 구성할 수 있다.
  2. 변수의 이름은 숫자로 시작할 수 없다.
  3. 변수의 이름 사이에는 공백을 포함할 수 없다.
  4. 변수의 이름으로 자바에서 미리 정의된 키워드(keyword)는 사용할 수 없다.

변수의 종류

자바에서 변수는 타입에 따라 크게 2가지로 분류 가능

1. 기본형(primitive type)변수

  • 실제 연산에 사용되는 변수이다.
  • 자바에서는 8가지 종류의 기본형 변수를 제공하고 있다.

    정수형 : byte, short, int, long
    실수형 : float, double
    문자형 : char
    논리형 : boolean

2. 참조형(reference type)변수

  • 사용자가 직접 만들어 사용하는 변수를 의미한다.

변수의 선언

  • 자바에서는 변수를 사용하기 전에 반드시 먼저 변수를 선언하고 초기화해야 한다.

변수의 선언만 하는 방법

  • 먼저 변수를 선언하여 메모리 공간을 할당받고, 나중에 변수를 초기화 하는 방법이다.
  • 하지만 이렇게 선언만 된 변수는 초기화 하지 않았으므로, 해당 메모리 공간에는 알 수 없는 쓰레깃값만이 들어있다. 따라서 선언된 변수는 반드시 초기화한 후에 사용해야만 한다.
int num; //변수의 선언
System.out.println(num); //오류 발생
num = 20; //변수의 초기화
System.out.println(num) // 20

변수의 선언과 동시에 초기화하는 방법

//문법
1. 타입 변수이름[, 변수이름];
2. 타입 변수이름 = 초깃값[, 변수이름 = 초깃값];

//예제
int num1, num2;	//같은 타입의 변수를 동시에 선언함
double num3 = 3.14; //선언과 동시에 초기화함
double num4 = 1.23, num5 = 4.56; //같은 타입의 변수를 동시에 선언하면서 초기화함

자바의 표준 입출력 클래스

  • 사용자가 프로그램과 대화하기 위해서는 사용자와 프로그램 사이의 입출력을 담당하는 수단이 필요하다. 자바에서는 모든 것이 객체로 표현되므로, 입출력을 담당하는 수단 또한 모두 객체이다.
  • 자바에서는 System이라는 표준 입출력 클래스를 정의하여 제공하고 있다. 이러한 System클래스는 java.lang 패키지에 포함되어 제공된다.
  • System클래스에는 표준 입출력을 위해 다음과 같은 클래스 변수(static variable)가 정의되어 있다.

1.System.in
2. System.out
3. System.err

System.out.println()

  • System.out.println()메소드를 사용하면 모니터에 전달된 데이터를 출력한 후에 줄 바꿈까지 해준다.
System.out.println(출력할데이터);

//예시
System.out.print(7)		//print()메소드는 줄 바꿈을 하지않음
System.out.print(3)		// 정수 출력
System.out.print(3.14)	// 실수 출력
System.out.print("자바!") // 문자열 출력
System.out.print("문자열끼리" + "연결도 가능");
System.out.print("숫자" + 3 +"과 문자열의 연결도 가능");

//실행결과
73
3.14
자바!
문자열끼리의 연결도 가능
숫자3과 문자열의 연결도 가능

조건문

  • 조건문은 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문이다.
  • 자바에서 사용하는 대표적인 조건문의 형태는 다음과 같다.
  1. if 문
  2. if / else 문
  3. if / else if / else 문
  4. switch 문

if 문

  • if 문은 조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, 거짓(flase)이면 아무것도 실행하지 않습니다.
  • if 문을 순서도로 표현하면 다음 그림과 같습니다.
if(조건식){
	조건식의 결과가 참일 때 실행하고자 하는 명령문;
}
if(ch >= 'a' && ch <= 'z'){
	System.out.println("해당 문자는 영문 소문자입니다.");
}
//실행결과
해당 문자는 영문 소문자입니다.

if / else 문

  • if문과 함께 사용하는 else 문은 if 문과는 반대로 주어진 조건식의 결과가 거짓(false)이면 주어진 명령문을 실행합니다.
if(조건식){
	조건식의 결과가 참일 때 실행하고자 하는 명령문;
} else{
    조건식의 결과가 거짓일 때 실행하고자 하는 명령문;
}
if (ch >= 'a' && ch <= 'z') {
    System.out.println("해당 문자는 영문 소문자입니다.");
} else {
    System.out.println("해당 문자는 영문 소문자가 아닙니다.");
}

//실행결과
해당 문자는 영문 소문자가 아닙니다.

if / else if / else 문

  • if / else if / else 문은 조건식을 여러 개를 명시할 수 있으므로 중첩된 if문을 좀 더 간결하게 표현할 수 있다.
if (조건식1) {
    조건식1의 결과가 참일 때 실행하고자 하는 명령문;
} else if (조건식2) {
    조건식2의 결과가 참일 때 실행하고자 하는 명령문;
} else {
    조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문;
}

//예제
if (ch >= 'a' && ch <= 'z') {
    System.out.println("해당 문자는 영문 소문자입니다.");
} else if (ch >= 'A' && ch <= 'Z') {
    System.out.println("해당 문자는 영문 대문자입니다.");
} else {
    System.out.println("해당 문자는 영문자가 아닙니다.");
}

//실행결과
해당 문자는 영문 대문자 입니다.

switch 문

  • switch 문은 if / else 문과 마찬가지로 주어진 조건 값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문이다.
  • 이러한 switch 문은 if / else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편이다.
//문법
switch (조건 값) {
    case1:
        조건 값이 값1일 때 실행하고자 하는 명령문;
        break;
    case2:
        조건 값이 값2일 때 실행하고자 하는 명령문;
        break;
    ...
    default:
        조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문;
        break;
}

반복문(iteration statements)

  • 반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수 만큼 반복하여 수행하도록 제어하는 명령문입니다. 프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문중 하나이다.
  1. while문
  2. do/while문
  3. for문
  4. Enchaned for 문

while문

  • 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행
  1. 조건식이 참(true)인지 판단하고, 참이면 내부의 명령문 실행
  2. 내부의 명령문을 전부 실행하고 나면, 다시 조건식으로 돌아와 또 한 번 참인지 판단
  3. 이렇게 조건식의 검사를 통해 반복해서 실행되는 반복문을 루프(loop)라고 함
//문법
while (조건식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}

int i = 0;

 
//예제
while (i < 5) {
    System.out.println("while 문이 " + (i + 1) + "번째 반복 실행중입니다.");
    i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.
}
System.out.println("while 문이 종료된 후 변수 i의 값은 " + i + "입니다.");

//실행결과
while 문이 1번째 반복 실행중입니다.
while 문이 2번째 반복 실행중입니다.
while 문이 3번째 반복 실행중입니다.
while 문이 4번째 반복 실행중입니다.
while 문이 5번째 반복 실행중입니다.
while 문이 종료된 후 변수 i의 값은 5입니다.

do / while 문

  • while 문은 루프에 진입하기 전에 조건식부터 검사하지만 do/while문은 먼저 루프를 한 번 실행한 후에 조건식을 검사한다. 즉, do/while문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행한다.
//문법
do {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);

//예제
int i = 1, j = 1;
while (i < 1) {
    System.out.println("while 문이 " + i + "번째 반복 실행중입니다.");
    i++;
}
System.out.println("while 문이 종료된 후 변수 i의 값은 " + i + "입니다.");
do {
    System.out.println("do / while 문이 " + i + "번째 반복 실행중입니다.");
    j++;
} while (j < 1);
System.out.println("do / while 문이 종료된 후 변수 j의 값은 " + j + "입니다.");

//실행결과
while 문이 종료된 후 변수 i의 값은 1입니다.
do / while 문이 1번째 반복 실행중입니다.
do / while 문이 종료된 후 변수 j의 값은 2입니다.

for문

  • for문은 while문과는 달리 자체적으로 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문이다. 따라서 while문보다는 좀 더 간결하게 반복문을 표현할 수 있다.
//문법
for (초기식; 조건식; 증감식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}

//예제
for (i = 0; i < 5; i++) {
    System.out.println("for 문이 " + (i + 1) + "번째 반복 실행중입니다.");
}
System.out.println("for 문이 종료된 후 변수 i의 값은 " + i + "입니다.");

//결과
for 문이 1번째 반복 실행중입니다.
for 문이 2번째 반복 실행중입니다.
for 문이 3번째 반복 실행중입니다.
for 문이 4번째 반복 실행중입니다.
for 문이 5번째 반복 실행중입니다.
for 문이 종료된 후 변수 i의 값은 5입니다.

메소드(method)

  • 자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가진다. 그 중에서 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

사용목적

  • 클래스에서 메소드를 작성하여 사용하는 이유는 코드의 반복적인 프로그래밍을 피할 수 있기 때문이다.
    또한, 모듈화로 인해 코드의 가독성도 좋아진다. 그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때도 손쉽게 유지보수를 할 수 있게 된다.

메소드 정의

접근제어자 반환타입 메소드이름(매개변수목록) { // 선언부
    // 구현부
}
  1. 접근 제어자 : 해당 메소드에 접근할 수 있는 범위를 명시
  2. 반환 타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시
  3. 메소드 이름 : 메소드를 호출하기 위한 이름을 명시
  4. 매개변수 목록(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시
  5. 구현부 : 메소드의 고유 기능을 수행하는 명령문의 집합
//예제
class Car {
    private int currentSpeed;
    private int accelerationTime;
    ...public void accelerate(int speed, int second) { // 선언부
        // 구현부
        System.out.println(second + "초간 속도를 시속 " + speed + "(으)로 가속함!!");
    }
    ...
}

메소드 호출

  • 참조 연산자(.)를 사용하여 호출가능
//문법
1. 객체참조변수이름.메소드이름();                  // 매개변수가 없는 메소드의 호출
2. 객체참조변수이름.메소드이름(인수1, 인수2, ...); // 매개변수가 있는 메소드의 호출

//예제
Car myCar = new Car();   // 객체를 생성함.
myCar.accelerate(60, 3); // myCar 인스턴스의 accelerate() 메소드를 호출함.

//예제 전문
class Car {
    private int currentSpeed;
    private int accelerationTime;
    public void accelerate(int speed, int second) {
        System.out.println(second + "초간 속도를 시속 " + speed + "(으)로 가속함!!");
    }
}
public class Method01 {
    public static void main(String[] args) {
        Car myCar = new Car();   // 객체 생성
        myCar.accelerate(60, 3); // 메소드 호출
    }
}

메소드 오버로딩(method overloading)

  • 메소드 오버로딩이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미한다.

  • 하지만 매개변수의 개수나 타입을 다르게 지정해준다면 하나의 이름으로 여러개의 메소드를 작성할 수 있다.
    즉, 메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것이라고 할 수 있다.

  • 메소드 오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나이다.

  • 대표적인 메소드 오버로딩의 예로는 println()이 있다.

오버로딩의 조건

  1. 메소드의 이름이 같아야 한다.
  2. 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 한다.
  3. 메소드 오버로딩은 반환타입과는 관계가 없다. 만약 메소드 시그니처는 같은데 반환 타입만이 다른 경우에는 오버로딩이 성립하지 않는다.

예제

  • 자바 컴파일러는 사용자가 오버로딩된 함수를 호출하면, 전달된 매개변수의 개수와 타입과 같은 시그니처를 가지는 메소드를 찾아 호출한다.
1. void display(int num1)              // 전달받은 num1을 그대로 출력함.
2. void display(int num1, int num2)    // 전달받은 두 정수의 곱을 출력함.
3. void display(int num1, double num2) // 전달받은 정수와 실수의 합을 출력함.

이제 사용자가 display()메소드를 호출하면, 컴파일러는 자동으로 같은 시그니처를 가지는 메소드를 찾아 호출한다.

1. display(10);       // 1번 display() 메소드 호출 -> 10
2. display(10, 20);   // 2번 display() 메소드 호출 -> 200
3. display(10, 3.14); // 3번 display() 메소드 호출 -> 13.14
4. display(10, 'a');  // 2번과 3번 모두 호출 가능

출처 | https://www.tcpschool.com/java/intro

profile
꾸준히합니다.
post-custom-banner

0개의 댓글