제어 흐름 이해하기
조건문
주어진 조건에 따라 다른 문장을 선택할 수 있도록 프로그래밍하는 것
조건 연산자로도 구현 가능
- if문
- if(조건식) {
수행문; //조건식이 참일 경우에 이 문장을 수행
}
- if(조건식) {
- if ~ else문
- if(조건식) {
수행문1; //조건식이 참일 경우 이 문장을 수행
}
else {
수행문2; //조건식이 거짓일 경우 이 문장을 수행
}
- if(조건식) {
- ii~else if~else문
- if(조건식1) {
수행문1; //조건식1이 참일 경우 이 문장을 수행
}
else if(조건식2){
수행문2; //조건식2가 참일 경우 이 문장을 수행
}
else if(조건식3){
수행문3; //조건식3이 참일 경우 이 문장을 수행
}
else {
수행문4; //위의 조건이 모두 해당하지 않는 경우에 수행
}
수행문5; //if~else if~else문이 끝난 후 수행함
- if(조건식1) {
- switch~case문
- 결과가 정수 또는 문자열 값이고 그 값에 따라 수행되는 경우가 각각 다른 경우에 자주 사용한다.
- 여러 문장이 있어도 { }를 사용하지 않는다.
- case : ~ break; 까지가 조건에 해당하는 문장이고 일치하는 case가 없다면 default 코드가 수행된다.
- 자바 7부터는 case 값에 문자열도 사용이 가능하다.
- switch(조건) {
case 값1:
수행문1;
break;
case 값2:
수행문2;
break;
case 값3:
수행문3;
break;
default:
수행문4;
}
반복문
반복되는 일을 처리하기 위해 사용하는 것
- while문
- 조건식이 참인 동안 수행문 반복해서 수행한다.
- while(조건식) {
수행문1; //조건식이 참인 동안 반복 수행
}
수행문2; //조건식이 거짓이 되면 수행
- do~while문
- { } 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사하여 while문을 진행
- do {
수행문; //무조건 실행
}
while(조건식) {
수행문2; //조건식이 참인 동안 반복 수행
}
수행문3; //조건식이 거짓이 되면 수행
- for문
- 반복문 중에서 가장 많이 사용하는 반복문
- 초기화식에서 사용할 변수를 초기화, 조건식에서 언제까지 반복할 것인지 구현
증감식에서 반복 횟수나 변수 값을 조정 - for(초기화식; 조건식; 증감식) {
수행문;
}
- 중첩된 반복문
- 반복문 안에 또 다른 반복문을 중첩해서 사용하는 경우가 있다.
- for(초기화식; 조건식; 증감식) {
for(초기화식; 조건식; 증감식) {
수행문1; //내부 반복문 내용 수행
}
수행문2; //외부 반복문 내용 수행
}
- continue문
- 반복문과 함께 쓰이며, 반복문 안에서 continue문을 만나면 이후의 문장은 수해하지 않고 for문의 처음으로 돌아가서 증감식을 수행한다.
- break문
- 반복문에서 break문을 사용하면 그 지점에서 더 이상 반복문을 수행하지 않고 반복문을 빠져나온다.
클래스와 객체
객체와 객체 지향 프로그래밍과 클래스
- 객체 : 의사나 행위가 미치는 대상
- 객체 지향 프로그래밍 : 객체를 정의하고 객체 간 협력을 프로그래밍하는 것
- 클래스
- 객체의 속성과 기능을 코드로 구현한 것
- 객체를 클래스로 구현하는 것을 '클래스를 정의한다' 라고 한다.
- 클래스를 정의하기 위해서는 클래스 이름과 클래스가 가지는 속성 또는 특성이 필요하다.
- 클래스 내부에 변수로 선언하는 속성을 멤버 변수 라고 한다.
- 클래스 이름은 대문자로 시작해야 한다.
- (접근 제어자) class 클래스 이름 {
멤버 변수;
메서드;
}
클래스 살펴보기
- 클래스 속성을 구현하는 멤버 변수
- 멤버 변수에 사용하는 자료형은 두 가지가 있다.
- 기본 자료형 : int, long, float, double 등
- 참조 자료형 : String, Date, Student 등
- 참조 자료형의 경우 JDK에서 제공하는 것이거나, 개발자가 직접 만들 클래스가 될 수도 있다.
- public class Student {
int studentID; //학번
String studentName; //학생 이름
int grade; //학년
String address; //주소
}
- 멤버 변수에 사용하는 자료형은 두 가지가 있다.
- 클래스 기능을 구현하는 메서드
- 메서드 : 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것
- 패키지란?
- 클래스 파일의 묶음
- 패키지를 생성하면 프로젝트 하위에 물리적으로 디렉터리가 생성된다.
- 계층 구조를 가질 수 있다.
메서드
- 함수란?
- 하나의 기능을 수행하는 일련의 코드
- 어떤 기능을 수행하도록 미리 구현해 놓고 필요할 때마다 호출하여 사용
- 함수 정의하기
- int add(int num1, int num2) {
//int:함수 반환형, add:함수 이름, int num1, num2: 매개변수
int result;
result = num1 + num2;
return result; //return: 예약어, result: 반환값
} - 함수 이름은 함수 기능과 관련 있게 만들어야 호출하거나 이애하기 좋다.
- 함수 반환형에 void를 쓰면 반환 값이 없다.
- int add(int num1, int num2) {
- 함수 호출하고 값 반환하기
- int num1 = 10;
int num2 = 20;
int sum = add(num1, num2); //add 함수 호출
System.out.println(sum); //30, 값 반환
public static int add(int n1, int n2) {
//int:함수 반환형, add:함수 이름, int num1, num2: 매개변수
int result;
result = n1 + n2;
return result; //return 예약어
} - 함수 호출할 때 넘겨주는 변수의 이름은 선언한 변수의 이름과 상관이 없다.
- int num1 = 10;
- 함수의 장점
- 함수를 사용하면 기능을 나누어 코드를 효율적으로 구현할 수 있다.
- 기능별로 함수를 구현해 놓으면 같은 기능을 매번 코드로 만들지 않고 그 기능의 함수를 호출하면 되기 때문에 편리하다.
- 프로그램을 시행할 때 생긴 오류를 수정하는 디버깅 작업을 할 때도 편리하다.
- 클래스 기능을 구현하는 메소드
- 클래스 내부에서 사용하는 멤버 함수를 메서드라 하는데 이는 멤버 변수를 사용하여 클래스의 기능을 구현한다.
- public class Student {
int studentID; //학번
String studentName; //학생 이름
int grade; //학년
String address; //주소
public String getStudentName() { //메서드
return studentName;
}
public void steStudentName(String name){ //메서드
studentName = name;
}
}
클래스와 인스턴스
- 클래스 사용과 main() 함수
- main() 함수는 자바 가상 머신이 프로그램을 시작하기 위해 호출하는 함수이다.
- 클래스 내부에 만들지만, 클래스의 메서드는 아니다.
- main() 함수에서 클래스를 사용하는 두 가지 방법
- 클래스 내부에 main() 함수를 만들기
- public class Student {
int studentID; //학번
String studentName; //학생 이름
int grade; //학년
String address; //주소
public String getStudentName() {
return studentName;
}
public void steStudentName(String name){
studentName = name;
}
public static void main(String args[]) {
Student student1 = new Student();
student1.studentName = "학생";
System.out.println(student1.studentName); //학생
System.out.println(student1.getStudentName()); //학생
} - 클래스 내부에 main() 함수 생성
- public class Student {
- 클래스 외부에 테스트용 클래스를 만들어서 사용
- main() 함수를 실행할 java 파일을 만들어서 함수 생성
- 클래스 내부에 main() 함수를 만들기
- new 예약어로 클래스 생성하기
- 클래스를 생성할 때 new 예약어를 사용하고 이어서 생성자를 써 줍니다.
- 클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.
- 클래스형 변수 이름 = new 생성자;
- Student student1 = new Student();
- Student 클래스 자료형으로 student1 변수를 선언하고 new Student();로 Student 클래스를 생성하여
student1에 대입한다는 뜻
- Student 클래스 자료형으로 student1 변수를 선언하고 new Student();로 Student 클래스를 생성하여
- Student student1 = new Student();
- 인스턴스 참조 변수
- 객체 : 의사나 행위가 미치는 대상
- 클래스 : 객체를 코드로 구현한 것
- 인스턴스 : 클래스가 메모리 공간에 생성된 상태
- 참조 변수 사용하기
- 참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있는데 이때 도트(.) 연산자를 사용한다.
- student1.studentName = "학생"; //멤버 변수 사용
System.out.println(student1.getStudentName()); //메서드 사용
생성자
- Student student1 = new Student();
클래스를 생성할 때 사용하는 Student() 같은 함수를 생성자라고 한다. - 생성자는 클래스를 생성할 때만 호출한다. 생성자 이름을 클래스 이름과 같고 반환값이 없다.
- 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어 준다.
이를 디폴트 생성자 라고 한다.
- 생성자 생성
- public class Student {
int studentID; //학번
String studentName; //학생 이름
int grade; //학년
String address; //주소
public Student() { } //디폴트 생성자 직접 추가
public Student(String sname) { //학생 이름을 매개변수로 입력 받아서 Student 클래스를 생성하는 생성자
studentName = sname;
}
} - 생성자를 직접 생성할 경우 디폴트 생성자를 직접 추가해 주어야 한다.
- public class Student {
- 생성자 오버로드
- 클래스에서 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드라고 한다.
- public class Student {
int studentID; //학번
String studentName; //학생 이름
int grade; //학년
String address; //주소
public Student() { }
public Student(String sname) {
studentName = sname;
}
public Student(String sname, int sid, int sgrade) {
studentName = sname;
studentID = sid;
grade = sgrade;
}
}
참조 자료형
- 클래스 자료형으로 선언하는 자료형
- public class Student {
int studentID; //학번
String studentName; //학생 이름
Subject korSubjcet;
Subject mathSubject;
}
public class Subject {
String SubjectName;
}
정보 은닉
- 접근 제어자
- 종류
- public : 외부 클래스 어디에서나 접근할 수 있다.
- protected : 같은 패키지 내부와 상송 관계의 클래스에서만 접근할 수 있고 그 외 클래스에서는 접근 불가
- 아무것도 없는 경우 : default이면 같은 패키지 내부에서만 접근할 수 있다.
- private : 같은 클래스 내부에서만 접근할 수 있다.
- 객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있다. 이러한 예약어를 접근 제어자 라고 한다.
- public class Student {
int studentID; //학번
private String studentName; //private로 선언
} - private로 선언하면 외부 클래스의 접근이 허용되지 않기 때문에 main 함수에서 호출이 불가능 하다.
- 종류
- get(), set() 메서드
- private으로 선언한 변수를 외부 코드에서 사용하기 위해서는 public 메서드를 제공해야 한다.
- 이때 사용 할 수 있는 것이 get(), set() 메서드 이다.
- public class Student {
int studentID; //학번
private String studentName; //학생 이름
//private 변수인 studentName에 접근해 값을 가져오는 public get() 메서드
public String getStudentName() {
return studentName;
}
//private 변수 studentName에 접근해 값을 지정하는 public set() 메서드
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
- 정보 은닉
- 클래스 내부에서 사용할 변수나 메서드는 private로 선언해서 외부에서 접근하지 못하도록 하는 것을 정보 은닉이라고 한다.
this 예약어
- 생성된 인스턴스 스스로를 가리키는 예약어이다.
- 생성자에서 다른 생성자를 호출할수도 있다.
- 자신의 주소를 반환하는데 쓰이기도 한다.
- class BirthDay {
int day;
int month;
int year;
public void setYear(int year) {
this.year = year; //bDay.year = year와 같음
}
public void printThis() {
System.out.println(this);
//System.out.println(bDay)와 같음
}
}
public class ThisExample {
public static void main(String[] args) {
BirthDay bDay = new BirthDay();
bDay.setYear(2000);
bDay.printThis();
}
}
객체 간 협력
- 객체 지향 프로그램은 객체를 정의하고 객체 간 협력으로 만들어진다.
- 학생 클래스 구현하기
public class Student {
public String studentName;
public int grade;
public int money;
//학생 이름과 가진 돈을 매개변수로 받는 생성자
public Student(String studentName, int money) {
this.studentName = studentName;
this.money = money;
}
//학생이 버스를 타면 1000원을 지불하는 기능을 구현한 메서드
public void takeBus(Bus bus) {
bus.take(1000);
this.money -= 1000;
}
public void takeSubway(Subway subway) {
subway.take(1500);
this.money -= 1500;
}
//학생의 현재 정보를 출력하는 메서드
public void showInfo() {
System.out.println(studentName + "님의 남은 돈은" + money + "입니다.");
}
}
- 버스 클래스 구현하기
public class Bus {
int busNumber;
int passengerCount;
int money;
//버스 번호를 매개변수로 받는 생성자
public Bus(int busNumber) {
this.busNumber = busNumber;
}
//승객이 버스에 탄 경우를 구하는 메서드
public void take(int money) {
this.money += money;
passengerCount++;
}
//버스 정보를 출력하는 메서드
public void showInfo() {
System.out.println("버스" + busNumber + "번의 승객은" + passengerCount + "명이고, 수입은"
+ money + "입니다.");
}
}
- 지하철 클래스 구현하기
public class Subway {
String lineNumber;
int passengerCount;
int money;
//버스 번호를 매개변수로 받는 생성자
public Subway(String lineNumber) {
this.lineNumber = lineNumber;
}
//승객이 버스에 탄 경우를 구현한 메서드
public void take(int money) {
this.money += money;
passengerCount++;
}
//버스 정보를 출력하는 메서드
public void showInfo() {
System.out.println("버스" + "busNumber" + "번의 승객은" + passengerCount
+ "명이고, 수입은 " + money + "입니다.");
}
}
- 학생, 버스, 지하철 객체 협력하기
public class TakeTrans {
public static void main(String[] args) {
Student studentJame = new Student("James", 5000);
Student studentTomas = new Student("Tomas", 10000);
Bus bus100 = new Bus(100); //노선 번호가 100인 버스 생성
studentJames.takeBus(bus100); //james가 100인 버스를 탐
studentJames.showInfo(); //james 정보 출력
bus100.showInfo(); //버스 정보 출력
Subway subwayGreen = new Subway("2호선"); //노선 번호가 2호선인 지하철 생성
studentTomas.takeSubway(subwayGreen); //Tomas가 2호선을 탐
studentTomas.showInfo(); //Tomas 정보 출력
subwayGreen.showInfo(); //지하철 정보 출력
}
}
static 변수
- static 변수의 정의와 사용 방법
- 정적 변수라고도 하며 변수를 선언할 때 자료형 앞에 static 예약어를 사용한다.
static int serialNum; - static 변수는 클래스 내부에 선언한다.
- 다른 멤버 변수처럼 인스턴스가 생성될 때마다 새로 생성되는 변수가 아니다.
- 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간에 할당되고 그 값은 모든 인스턴스가 공유
- 클래스에 기반한 변수라고 해서 클래스 변수 라고도 한다.
- public class Student {
public static int serialNum = 1000;
}
public class StudentTest {
public static void main(String[] args) {
Student student1 = new Student();
student1.serialNum++; //static 변수 값 증가
Student student2 = new Student();
System.out.println(student2.serialNum); //증가된 값 출력
}
}
- 정적 변수라고도 하며 변수를 선언할 때 자료형 앞에 static 예약어를 사용한다.
- 클래스 변수
- static 변수는 인스턴스 생성과 별개이므로 인스턴스보다 먼저 생성되기 때문에 클래스 이름으로도 참조가 가능하다.
- public class Student {
public static int serialNum = 1000;
public int studentID;
public Student() {
serialNum++;
studentID = serialNum;
}
}
public class StudentTest {
public static void main(String[] args) {
Student student1 = new Student();
System.out.println(Student.serialNum); //1001
Student student2 = new Student();
System.out.println(Student.serialNum); //1002
}
}
- 클래스 메서드
- static 변수를 위한 메서드를 클래스 메서드라고 한다.
- public class Student {
private public static int serialNum = 1000;
public int studentID;
public Student() {
serialNum++;
studentID = serialNum;
}
//serialNum의 get() 메서드
public static int getSerialNum() {
int i = 10;
return serialNum;
}
//serialNum의 set() 메서드
public static void setSerialNum(int serialNum) {
Student.serialNum = serialNum;
}
}
public class StudentTest {
public static void main(String[] args) {
Student student1 = new Student();
System.out.println(Student.getSerialNum());
Student student2 = new Student();
System.out.println(Student.getSerialNum()); //증가된 값 출력
}
}
- 클래스 메서드와 인스턴스 변수
- 클래스 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.
- 클래스 메서드와 클래스 변수는 인스턴스가 생성되지 않아도 사용할 수 있다.
- public class Student {
private public static int serialNum = 1000;
public int studentID;
//serialNum의 get() 메서드
public static int getSerialNum() {
int i = 10;
return serialNum;
}
//serialNum의 set() 메서드
public static void setSerialNum(int serialNum) {
Student.serialNum = serialNum;
}
}
public class StudentTest {
public static void main(String[] args) {
System.out.println(Student.getSerialNum()); //인스턴스 생성 없이 호출 가능
}
}
변수 유효 범위
- 지역 변수 유효 범위
- 지역변수는 함수나 메서드 내부에 선언하기 때문에 함수 밖에서는 사용할 수 없다.
- 하나의 함수에 선언한 지역 변수는 다른 함수에서 사용 불가능
- 지역 변수가 생성되는 메모리를 스택이라 하고, 지역 변수가 호출될 때 생성되었다가 함수가 반화되면
할당되었던 메모리 공간이 해제되면서 함께 없어진다.
- 맴버 변수의 유효 범위
- 멤버 변수는 인스턴스 변수라고도 한다.
- 클래스가 생성될 때 힙 메모리에 생성되는 변수
- 멤버 변수는 클래스의 어느 메서드에서나 사용 가능하다
- static 변수의 유효 범위
- static 변수는 클래스 생성과 상관 없이 처음부터 데이터 영역 메모리에 생성된다.
- private이 아니라면 클래스 외부에서도 객체 생성과 무관하게 사용 가능하다.
'Java-Study' 카테고리의 다른 글
Java Study : 4주차 - 백준 문제풀이 (0) | 2022.11.26 |
---|---|
Java Study : 4주차 정리 - 배열과 ArrayList, 상속과 다형성 (0) | 2022.11.26 |
Java Study : 3주차 - 문제 풀이 (1) | 2022.11.19 |
Java Study : 2주차 정리 (0) | 2022.11.07 |
Java Study : 1주차 정리 (0) | 2022.11.06 |