변수
변수의 선언 및 초기화 방법
데이터타입 변수명; 변수명 = 값; // 변수 선언과 초기화를 따로
int a; a= 10;
데이터타입 변수명 = 값; // 변수의 선언과 동시에 초기화
데이터타입
실수 : byte, short, int, long
정수 : float, double
논리 : true, false
문자 : char
참조 : String(문자열 참조변수이자 클래스)
형변환
데이터타입을 다른 데이터타입으로 변경하는것
자동형변환 : 데이터타입의 크기가 더 커지고, 데이터 왜곡이 없으면 자동으로 변환된다.
예) int -> long, float -> double
정수의 경우 실수로 자동형변환이 가능하다
int a = 10;
float b = a; // b 10.0(데이터 왜곡이 없기 때문에 가능)
또한 char의 경우 문자 -> 숫자는 자동형변환이 가능하다.
char a = 'A';
int b = a; // 'A'의 유니코드인 65로 변환
수동형변환(casting) : 데이터의 손실을 감안하고 강제로 형변환 하는것
형변환 시킬 값 앞에 (변경할 데이터타입) 을 붙여 변경한다.
float a = 3.14f;
int b = (int) a; // 소수점은 버려지고 b=3 대입
int a = 65; // float도 가능
char b = (char) a; // b에 유니코드 65에 대응하는 'A' 대입, float의 경우 소수점은 버려진 체로 유니코드에 대응
수동형변환시 () 소괄호의 유무에 따라 값이 완전히 달라지기도 한다.
float a = 3.14f
int b = (int) 3.14f + 5 // 오류발생
int b = (int) (3.14f + 5) // 3.14+5를 먼저 한 후에 8.14에서 소수점을 제거하여 b에 대입 b = 8;
boolean은 수동형변환으로도 변환 불가능하다.
전역변수, 지역변수
전역변수는 클래스, 또는 인스턴스의 자식으로 클래스 내에 어디에서든 호출할수 있는 변수이다.
클래스의 자식이면 static이 앞에 붙으며, 코드 시작전에 미리 생성이 되어있고,
인스턴스의 자식이면 코드의 진행중 new에 의해서 생성된다.
지역변수는 메서드의 자식으로 메서드 내에서만 사용이 가능하며, 메서드 실행이 끝난 후에는 메모리 상에서 사라진다.
대표적인 지역변수로 매개변수가 있으며, 매개변수는 메서드 호출시 입력되는 파라미터를 받아 메서드에 대입하는 역할을 한다.
연산자
연산자는 크게 산술연산자, 비교연산자, 대입연산자로 나누어지며
산술연산자는 숫자끼리 사칙연산하여 값을 구하기 위해,
비교연산자는 숫자끼리 비교하여 true / false를 구해 제어문에 사용하기 위해,
대입연산자는 변수에 값을 대입하기 위해 사용한다. (변수에 값을 대입하면 값이 덮어씌어진다)
연산자에는 우선순위가 있는데 괄호가 가장 먼저 처리되고, 대입연산자(=)이 마지막에 처리된다.
또한 단항연산자중 ++, --가 변수의 뒤에 있으면, 이는 대입연산자 보다 늦게 처리된다
(a++ b-- 등)
제어문
조건문 : if문과 switch문이 있으며, if문은 if, if else, if else-if else로 나누어져 있고,
if문은 데이터의 검증에 주로 사용하며, 값이 제대로 입력되었는지를 판단한다.
if else문은 선택지가 2가지인 경우에 주로 사용하며, 조건에 따라 분기점을 나눌때 사용한다.
if else-if else문은 선택지가 3개 이상인 경우 사용하며, 조건에 따라 분기점을 나눌때 사용한다.
if문의 조건식에는 조건값의 범위설정이 가능하다는 특징이 있다.
switch문은 조건식에는 값을, 각각의 case에는 명확한 값을 두고, case에 설정해둔 값에 일치하면 case를 실행,
일치하지 않으면 다음 case를 실행하여 일치하는게 없으면 default를 실행한다.
또한 각 case 마다 break;를 두어 조건이 일치하면 조건문을 끝내는 식으로 두었고,
break를 두지 않으면 switch문을 순회하게 할수도 있다.
반복문 : 같은 동작을 같은 내용이나, 다른 내용으로 반복하기 위해 사용한다.
for문은 정확한 횟수가 정해져 있을 때 사용하며, for문을 사용하기 위해서 초기화, 조건식, 증감식이 필요하다.
for(int i = 1; i < 10; i++){} 의 형태를 가지며, int i = 1;이 초기화, i < 10은 조건식, i++가 증감식에 해당한다.
for문은 초기화된 값이 조건식을 만족하지 않을때 멈추게 되며 수치로 기입하기 때문에 횟수가 명확하다.
while문은 횟수는 몰라도 조건이 맞춰져야 할때 사용하며, 보통 조건식에 true를 넣어 무한반복으로 두고,
break;를 이용해 중단하는 방식으로 많이 사용한다.
while문은 주로 사용자의 잘못된 값 입력시에 다시 기회를 줄때 사용하고,
처음부터 while을 적용하지 않고 코드 작성중 필요에 따라 while을 나중에 추가한다.
break; continue;
break;는 현재 진행중인 반복문의 반복을 종료시킨다.
continue;는 현재 진행중인 반복문 회차를 스킵하고 처음으로 돌아가서 다음 회차를 진행한다.
배열
배열 변수 하나에 여러가지 값을 넣은 형태이다.
배열변수의 선언 방법은
데이터타입[] 변수명 = new 데이터타입[배열길이]; 이고,
int[] a = new int[3];
변수명[인덱스] = 값; 의 형태로 값을 대입한다.
a[0] = 10;
a[1] = 20;
배열의 길이
배열변수.length(배열변수는 배열객체를 가르키는 참조변수 취급이므로 . 사용가능)
배열의 길이는 배열변수 안에 있는 배열의 갯수이며,
인덱스는 0부터 시작하기 때문에 배열의 길이보다 1 낮다.
다차원 배열
배열 선언시 대괄호를 2개 집어넣는다
int[][] a; // 2차원 배열변수 a 선언
첫번째 대괄호는 인덱스 행, 두번째 대괄호는 인덱스 열에 해당한다.
int[][] a = new int[3][2]; // 인덱스 행 3 열 2
배열의 갯수는 [0][0]부터 [2][1]까지 총 6개의 배열을 가진다.
주로 [학년][반]등으로 사용하여 표현하기도 한다.
클래스
클래스는 객체의 설계도이다.
객체는 클래스를 기반으로 만들어진 오브젝트이다.
클래스에서 객체를 만들기 위해서는 new를 이용해 생성할수있다.
클래스명 변수명 = new 클래스명(); 의 형태로 생성되며
이때 변수는 참조변수, 클래스명()은 생성자라고 불린다.
참조변수는 값이 아닌 클래스의 주소를 저장하기 때문에 일반변수와 다르다.
변수는 인스턴스 변수와 클래스 변수로 나뉘며
클래스 변수는 변수 데이터타입 앞에 static이 붙으며, 메모리 로딩시 미리 생성되어 있으며 하나만 존재할수 있고,
클래스이름으로 직접 접근이 가능하다.
인스턴스 변수는 new에 의해 생성되고, 여러개를 만들수 있으며, 각각의 값을 가질수있으며, 참조변수를 통해 접근할수있다.
메서드
특정한 작업이나 논리를 구성하는 코드를 괄호로 묶어 놓은것으로, 값을 받아서 내부에서 처리하여 결과를 출력 또는 반환한다.
메서드의 생성
반환타입 메서드명(매개변수) {return;}
반환타입에는 데이터타입과 참조변수 또는 void가 올수 있으며, 데이터타입은 return을 통해 값을 반환하고,
참조변수는 값을 반환할수도, 안할수도 있으며, void는 값을 반환하지 않는다.
메서드의 호출
메서드를 호출하기 위해서는 메서드이름(파라미터)의 형태로 부르며, 메서드에서 요구하는 매개변수의 갯수와 타입을 맞춰야 호출 가능하다.
클래스 멤버와 인스턴스 멤버간 참조 및 호출
클래스 멤버가 인스턴스 멤버를 호출하는 경우 클래스 멤버는 이미 생성되어있고, 인스턴스 멤버는 아직 생성되지 않았기 때문에 호출이 불가능하며, 이 외의 경우에는 호출 및 참조가 가능하다.
생성자
생성자의 사용 목적으로는 전역변수를 초기화하기 위해서 사용한다.
클래스에는 반드시 하나 이상의 생성자가 필요하지만, 따로 생성자를 만들지 않으면 컴파일러가 자동으로 기본생성자를 만들어준다.
생성자는 클래스명(){}의 형태로 이루어져 있으며, 클래스와 이름이 같고, 리턴값이 없다는 특징이 있다.
생성자는 생성시 클래스명(){}의 형태가 고정되기 때문에 오버로딩을 적용하여 클래스 이름이 같더라도 매개변수의 갯수와 타입을 다르게하여 전역변수의 값을 바꿀수있다.
상속
자식클래스에게 부모클래스 안에 있는 변수와 메서드에 접근할수 있게 한다.
상속 방법
class 부모클래스 {
}
class 자식클래스 extends 부모클래스 {
}
extends를 이용해 부모클래스명을 적어 자식클래스임을 나타낸다.
예시)
class Parent {
void say() {
System.out.println("말하다");
}
}
class Child extends Parent { // Parent 클래스를 상속
}
public class test { // 메인클래스
public static void main(String[] args) {
Child c = new Child();
c.say(); // Child 클래스에 say() 메서드가 없음에도 불구하고 호출가능 / 출력 : 말하다
}
}
오버라이딩
부모클래스로부터 상속받은 메서드를 자식클래스에서 변경할수있다.
예시)
class Parent {
void say() {
System.out.println("말하다");
}
}
class Child extends Parent { // Parent 클래스를 상속
@Override
void say() {
System.out.println("안녕하세요"); // 부모클래스의 메서드 say를 "안녕하세요"로 오버라이딩
}
}
public class test { // 메인클래스
public static void main(String[] args) {
Child c = new Child();
c.say(); // 출력 : 안녕하세요
}
}
오버라이딩을 할때는 부모클래스에 존재하는 메서드와 동일한 메서드 명을 사용하며, 메서드 선언 위에 @Override를 적는다.
이클립스에서는 자식클래스에 우클릭 -> source -> Overriding 을 통해 생성할수있다.
상속과 생성자
상속을 받은 자식클래스는 메인메서드에서 new를 이용해 인스턴스를 생성 해주지만
부모클래스는 따로 생성 하지 않음에도 사용가능하다.
이는 자식 클래스속의 생성자 super()에 의해 부모클래스가 생성 되기 때문이다.
super()는 기본적으로는 보이지 않지만 기본생성자로서 자식클래스 내에 존재하게 되는데
따로 부모클래스에서 매개변수 갯수를 다르게 한 생성자가 존재하면 기본생성자를 만들어주지 않는다.
따라서 부모 클래스에 매개변수가 필요한 생성자가 있다면 기본생성자가 생성되지 않기 때문에
별도로 기본생성자를 만들거나, 매개변수에 맞는 생성자를 넣지 않으면 부모클래스는 생성되지 않는다.
예시)
부모클래스에 매개변수 1개가 필요한 생성자가 존재, 자식클래스에 매개변수 2개가 필요한 생성자가 존재
메인메서드에서 자식클래스에 파라미터 2개를 이용해 생성
자식클래스는 생성되었지만, 부모에 기본생성자도 없고, 자식에 파라미터 1개짜리 생성자가 없어서 부모는 생성되지 않음
부모를 찾을수 없기 때문에 에러발생
패키지
클래스를 모아놓은 집합으로, 클래스의 유지보수와 관리를 용이하게 하기위해서 패키지를 사용한다.
import
다른 패키지에 있는 클래스를 사용하고 싶을 때 클래스의 이름으로 참조한다.
import 패키지명.클래스명;
위의 형태로 다른 패키지의 클래스에 접근할수 있다.
접근제어자
외부에서 접근할수 있는 정도와 범위를 정해주는 역할을 한다.
public | 접근 제한 없음 |
protected | 같은 패키지 내 또는 자손 클래스에서 접근가능 |
default(기본적용) | 같은 패키지 내에서만 접근가능 |
private | 같은 클래스 내에서만 접근가능 |
기본적으로 생략하게 되면 default가 적용되어 같은 클래스 내에서만 접근이 가능한 상태가 된다.
다형성
부모클래스를 상속받은 자식클래스는 부모클래스를 포함하기 때문에 부모클래스의 참조변수로 자식클래스를 참조하는것이 가능하다는 것이다.
하지만 자식클래스로 부모클래스를 참조하려고 할 경우 자식은 부모와 자식을 포함한 인스턴스를 모두 가지고 있지만 부모는 부모클래스의 인스턴스만 가지고 있기때문에 자식클래스의 참조변수로 부모클래스를 참조하려고 하면 오류가 발생한다.
예시)
class A {
void methodA() { // 부모클래스 메서드A 선언
System.out.println("메서드A");
}
}
class B extends A {
void methodB() { // 자식클래스 메서드B 선언
System.out.println("메서드B")}
}
public class test {
public static void main(String[] args) {
A obj = new B(); // 다형성을 이용한 인스턴스 생성
obj.methodA(); // 부모클래스를 거쳐 methodA를 찾아 실행
obj.methodB(); // 부모클래스에 methodB가 없기 때문에 실행불가 에러
}
}
다형성을 이용해서 인스턴스를 생성하게 되면 부모클래스를 먼저 접근한 후, 오버라이딩을 통해 자식클래스의 메서드로 넘어간다.
위의 코드에서 obj는 부모 클래스로 자식 클래스를 참조하는 참조변수이므로, 부모클래스에 해당하는 메서드가 없으면 호출할수 없다.
그렇기 때문에 부모 클래스에 존재하는 메서드A는 실행 가능하지만, 자식 클래스에만 존재하는 메서드B는 호출할수 없다.
다형성 사용예제)
class parent { // 부모클래스 parent
void show(){ // 메서드 show
System.out.println("부모클래스 show()");
}
}
class child { // 자식클래스 child
void show(){ // 메서드 show(=오버라이딩)
System.out.println("자식클래스 show()");
}
}
public class test { // 메인 클래스 test
public static void main(String[] args) { // 메인 메서드
parent c = new child(); // 부모클래스를 참조하여 자식클래스에 접근하는 참조변수 c 생성
c.show();
// 참조변수 c 안의 show 실행 / 부모클래스로 접근, 메서드 show() 발견, 오버라이딩 된 자식 클래스로 이동, 자식클래스에서 show() 실행 / 출력 : 자식클래스 show()
}
}
다형성을 이용하면 부모클래스에서 오버라이딩된 자식클래스로 접근할수 있기 때문에 여러개의 자식클래스를 공통된 데이터타입을 부모클래스명으로 두어 자식클래스에 접근하기 용이하다.
'프로그래밍 공부' 카테고리의 다른 글
2025.01.22 java 공부 (0) | 2025.01.22 |
---|---|
2025.01.21 java 공부 (0) | 2025.01.21 |
2025.01.17 java 공부 (0) | 2025.01.17 |
2025.01.16 java 공부 (0) | 2025.01.16 |
2025.01.15 java 공부 (0) | 2025.01.15 |