[Java 스터디] 제어문 & 객체지향이란 무엇일까?
개요
이번 포스팅에서는 프로그래밍의 가장 기초가 되는 제어문과 자바에서 매우 중요하게 여겨지는 객체지향의 개념을 알아보자.
cf) 이 글은 2023년 4월 4일에 진행됐던 sscc 자바 스터디 3주차 스터디 내용을 정리한 글입니다.
1. Java의 제어문
1-1) 조건문
if ~ else문
다른 언어들과 매우 비슷하다. if부터 else까지가 한 세트이다.
if (조건문) {실행문}으로 구성된다. 조건문이 true일 때 실행된다.
한 세트 내에서 어떤 if문도 실행되지 않으면 else문이 실행된다.
switch ~ case문
이것도 마찬가지로 다른 언어들과 똑같다.
1
2
3
4
5
6
7
switch (입력값) {
case (값) :
실행문
...
default:
실행문
}
switch문에서 주의해야할 점은
입력값에 실수형을 쓸 수 없다는 점이다.
만약 입력값 부분에 float, double형이 들어가 있다면 에러가 난다.
1-2) 반복문
while문
다른 언어들과 거~~~의 똑같다.
1
while (조건문) {실행문}
조건문이 true인 동안 계속 실행된다. -> 무한 반복도 가능. (while(true))
일반 for문
C언어와 똑같다. (1도 바뀐 점 없음)
1
for (초기값; 조건문; 증감식) { 실행문 }
초기값이 증감식에 따라 변화한다.
조건문이 true인 동안에는 계속 실행된다.
-> i는 for문에 소속된 지역변수이다. (for문 끝나면 사라짐)
-> 상황에 맞게 i++, ++i를 잘 사용하면 큰 도움이 된다. i+=2도 가능!
향상된 for문
배열에 특화된 for문이다.
1
for (지역변수 선언 : 배열) { 실행문 }
선언된 지역변수에 배열의 값을 하나씩 대입하며, 배열이 끝날때까지 반복하는 편리한 반복문이다.
ex)
1
2
3
4
5
6
7
8
9
public class Main {
public static void main(String[] args) {
String[] names = {"파이리", "리자드", "리자몽"};
for (String pokemon : names) {
System.out.println(pokemon);
}
}
}
2. 객체지향이란 무엇일까?
2-1) 객체란?
객체란 상태(데이터)와 행동(함수)를 동시에 가지고 있는 것을 뜻한다.
-> 현실 세계에 존재하는 대부분의 것들이 이렇다!
구분 | 사람 | 자동차 | 포켓몬 |
---|---|---|---|
상태(데이터) | 나이, 역할 | 속력, 차 종 | 타입, 출산지 |
행동(함수) | 밥먹기, 걷기, 숨쉬기 | 전진, 후진, 정지 | 공격, 방어, 도망가기 |
클래스와 객체의 차이
클래스와 객체가 서로 밀접한 관계에 있다 보니 서로 혼용하여 쓰는 경우가 많은데, 엄밀히 따지면 둘의 의미는 다르다.
클래스는 객체를 만드는 설계도다.
몇몇 책에서는 붕어빵을 만드는 빵틀로 비유를 하기도 한다.
같은 붕어빵 모양일지라도 속에 들어가는 재료가 팥이냐, 슈크림이냐에 따라 다른 붕어빵이 되는 것과 같은 원리다.
자동차를 만드는 상황을 예시로 들어볼까?
<설계도> 자동차는 이름과 속력이라는 데이터를 가져야하고, 전진, 후진, 정지라는 행동을 할 수 있어야 한다. 설계도>
자동차를 만드려면 이렇게 쓰여진 설계도가 필요하다. 그것이 바로 클래스이다.
2-2) 클래스의 기본 구조
코드 예시를 보며 하나 하나 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
class Pokemon{ //클래스 이름
String type; //멤버 변수(field)
int age;
Pokemon(String str, int num) { //생성자
this.age = num;
this.type = str;
}
void sayType() { //멤버 함수(메소드)
System.out.println("My name is " + type);
}
}
클래스 이름은 pokemon이다.
field라고도 불리는 멤버 변수 부분은 객체의 데이터를 정의한다.
보통 클래스의 맨 윗부분에 정의한다.
메소드라고도 불리는 멤버 함수 부분은 객체의 행동을 정의한다. 즉, 객체가 가지게 될 함수를 정의한다.
그 중, 생성자는 특수한 메소드다.
생성자
객체 생성시에 호출되는 함수를 의미한다.
파라미터를 받아서 객체의 멤버 변수 값을 세팅한다.
개발자가 생성자를 정의하지 않으면, Java가 컴파일 타임에 기본 생성자를 슬쩍 끼워 넣어준다.
그 이유는, Java에서는 생성자를 호출시키지 않고는 클래스로부터 객체를 만들 수 없기 때문이다.
생성자에 대한 자세한 설명은 이 블로그를 참고해주세요.
그렇다면, 생성자는 어떻게 사용하는 것일까?
아까 2-2)에서 살펴본 코드를 다시 살펴보자.
1
2
3
4
Pokemon(String str, int num) { //생성자
this.age = num;
this.type = str;
}
생성자는 언뜻보면 메소드와 비슷하게 생겼지만 1) 리턴형이 없고, 2) 함수명과 클래스명이 동일하다는 것이 특징이다.
보통 관습적으로 필드와 동일한 이름을 갖는 매개변수를 사용한다 (이 코드는 아님).
이럴 경우, 필드와 매개 변수의 이름이 동일하기 때문에, 생성자 내부에서 해당 필드로 접근이 불가능해진다.
(동일한 이름의 매개변수가 우선순위가 더 높기 때문)
이를 해결하기 위해 필드 앞에 “this“를 붙인다.
this는 객체 자기 자신의 참조이다.
2-3) 객체 생성
클래스 작성은 설계도 작성일 뿐 객체를 생성하지 않는다면 아무 의미가 없다.
객체는 new를 사용해서 생성할 수 있다.
2-2)에서 만들었던 Pokemon 클래스의 객체를 new 연산자를 이용하여 만들어보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
class Pokemon{ //클래스 이름
String type; //멤버 변수(field)
int age;
Pokemon(String str, int num) { //생성자
this.age = num;
this.type = str;
}
void sayType() { //멤버 함수(메소드)
System.out.println("My name is " + type);
}
}
1
2
3
4
5
6
7
8
9
public class Main {
public static void main(String[] args) {
Pokemon charmander = new Pokemon("fire", 5);
Pokemon pikachu = new Pokemon("electric", 4);
Pokemon ditto = new Pokemon("normal", 6);
ditto.sayType();
}
}
.연산자를 이용하여 객체의 함수를 사용할 수 있다.
위 코드를 수행하면 My type is normal
이라는 문구가 화면에 출력된다.
3. 입력 받기 & 꿀팁
3-1) 입력 받기
자바에서는 입력을 받기 위해서는 Scanner 클래스를 사용하기 위해서 java.util.Scanner를 따로 import 해줘야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int count = scanner.nextInt();
System.out.println(name);
System.out.println(count);
scanner.close();
}
}
2절에서 클래스와 객체에 대한 개념을 이해했다면 위 코드를 이해할 수 있을 것이다.
Scanner 클래스를 사용해서 scanner라는 객체를 생성한다.
여기서 System.in을 생성자로 사용하는 것이다.
그리고, Scanner 클래스의 nextLine, nextInt 등의 메소드를 사용해서 입력을 받는다.
close는 사용이 끝나면 scanner의 사용을 종료하는 메소드인데, 객체지향프로그래밍 강의 시간에 교수님께서 이 코드는 웬만하면 프로그램이 종료할 시점까지는 사용하지 말라고 하셨다.
(키보드와 해당 객체와의 연결만을 끊어버리는 것이 아니라, 모든 Scanner 객체의 연결을 다 끊어버리기 때문이라고..)
3-2) 꿀팁
Code Reformat
Ctrl + Alt + L 해당 명령어는 번잡하고 정리가 안 된 코드들을 띄어쓰기나 줄바꿈, 코드 형태 정리 등을 자동으로 해주는 기능이다.
Ctrl + A로 전체 코드를 선택한 다음 이 명렁어만 사용하면 되니까 매우 간편! 꼭 써보자.
이번 포스팅에서는 제어문의 종류와 문법에 대한 설명과
자바에서 매우 중요한 개념인 객체 지향에 대해서 간단하게 알아보았다.
Java는 모든 것이 클래스다
라는 말이 있을 정도로 Java에서 클래스는 매우 중요한 개념이므로 Java를 배우는 단계라면 꼭 정립하고 가야 될 개념이다.
댓글남기기