1. 싱글톤 패턴(Singleton Pattern)

- 어떤 클래스의 객체는 오직 하나임을 보장 → 전역의 개념으로 객체 사용

- 객체의 생성을 제한하기 위해 사용

 

public class Singleton {
	// 싱글턴 패턴 - 객체를 1개만 만들어 유지하기 위한 디자인 패턴
	// 1. 외부에서 생성자를 사용할 수 없도록 생성자에 private을 붙임
	private Singleton() {}
	
	// 2. 자신의 클래스 내부에서 스스로의 객체 1개 생성
	// 이때 멤버변수는 힙에 할당된 객체 없이 쓸 수 있도록 static
	private static Singleton instance;
	
	static {
		instance = new Singleton();
	}
	
	// 3. 외부에서 이 클래스의 객체를 필요로 하는 경우
	// 2번에서 static으로 생성된 객체의 주소를 return
	public static Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

private 접근 제한자는 외부에서 접근할 수 없어 원래는 new 키워드를 이용한 객체 생성이 불가능하다.

이 때 위와 같이 static 키워드를 이용하여 singleton 타입의 객체를 생성할 수 있다.

public class MainClass {
	public static void main(String[] args) {
		// Singleton 객체는 생성자가 private이므로 인스턴스 생성 불가
		// new 키워드로 객체 생성 및 조회가 불가능
		// Singleton s1 = new Singleton();

		Singleton s1 = Singleton.getInstance();
		System.out.println("s1의 레퍼런스 : " + s1);
		
		Singleton s2 = Singleton.getInstance();
		System.out.println("s2의 레퍼런스 : " + s2);
	}
}

위와 같이 Singleton 타입을 이용하여 객체를 생성할 수 있고, s1과 s2 모두 같은 주소를 참조하고 있는 것을 확인할 수 있다.

위와 같이 단 하나의 객체만을 생성해야 할 필요가 있을 때 Singleton 패턴을 이용한다.

'네트워크캠퍼스 > JAVA' 카테고리의 다른 글

추상화  (0) 2024.01.15
final  (0) 2024.01.15
사용제한자  (0) 2024.01.12
매개변수의 다형성  (0) 2024.01.11
배열의 다형성  (0) 2024.01.10

1. vim 에디터

1) 파일 열기 및 신규 파일 작성과 저장

$ vim [파일명] → :w 저장

$ vim 한 경우 → :w [파일명]으로 저장

:wq or ZZ → 저장 및 종료

:wq! → 강제 저장 후 종료

 

2) 파일 편집

① 커서 이동 : 왼쪽(h), 위(k), 오른쪽(l), 아래(j)

② 문자 삭제 : x

③ 입력모드 : i, a

④ 커서의 빠른 이동

- 단어 단위로 이동

w 다음 단어의 첫 글자로 이동
b 이전 단어로 이동

 

- 왼쪽, 오른쪽 끝으로 이동

0 가장 왼쪽으로 이동
$ 가장 오른쪽으로 이동

 

- 행 번호로 이동

[숫자]G 숫자번째 줄로 이동
gg 문서의 첫 번째 줄로 이동
G 문서의 마지막 줄로 이동

 

- 페이지 넘기기

ctrl + f 한 번에 한 페이지 넘기기
ctrl + b 한 번에 이전 페이지로 넘기기
ctrl + d 한 번에 1.5페이지씩 넘기기
ctrl + u 한 번에 이전 1.5페이지로 넘기기

 

- 삭제 : x, d

dd 해당 줄 삭제
d$ 해당 줄 내의 문자만 삭제
d0 현재 행부터 시작지점까지 삭제
x, dl 문자 하나 삭제
dw 단어 하나 삭제
dgg 현재 위치에서 시작지점까지 삭제
dG 현재 위치에서 마지막 지점까지 삭제

 

- 붙여넣기 : p

d로 직전에 지운 텍스트는 p를 눌러 다시 붙여넣을 수 있음

 

- 복사 : y

yy 해당 줄 복사
y$ 해당 줄 내의 문자만 복사
y0 현재 행부터 시작지점까지 복사
y, yl 문자 하나 복사
yw 단어 하나 복사
ydgg 현재 위치에서 시작지점까지 복사
yG 현재 위치에서 마지막 지점까지 복사

 

- 이외 조작방법

J 개행문자 삭제
U 이전 동작 취소 (ctrl + z 기능)
ctrl + r 취소 동작 복구

 

- 검색 

/ 내용 enter 아래 방향으로 검색
? 내용 enter 위 방향으로 검색
다음 내용으로 이동
N 이전 내용으로 이동

 

- 치환 : :%s/찾을문자/바꿀문자/g (모두 찾아바꾸기 기능)

 

- 공식문서 찾아보기

$ vimtutor : 튜토리얼 이용해 기본동작 연습

:help : 도움말 확인

'네트워크캠퍼스 > LINUX' 카테고리의 다른 글

Devops와 SE를 위한 리눅스 커널 이야기  (0) 2024.01.17
프로세스  (0) 2024.01.16
파일시스템  (0) 2024.01.11
프롬프트  (0) 2024.01.10
Shell  (0) 2024.01.09

1. .gitingore 파일

→ git으로 저장소를 관리할 때 필요 없는 파일들(개인적 설정을 위한 파일 등)에 대해 업로드를 원천적으로 막도록 세팅하는 파일

 

먼저, .gitignore.txt 파일을 생성해준다.

 

위와 같이 metadata를 추가해주고 txt 확장자를 없애준다.

 

add와 commit을 진행하면 .gitignore에 작성된 파일명이나 폴더명에 해당하는 것들은 대상에서 제외된다.

즉, .metadata 폴더를 제외한 내용들만 안전하게 업로드할 수 있게 된다.

 

 

'네트워크캠퍼스 > GIT, GITHUB' 카테고리의 다른 글

풀 리퀘스트  (0) 2024.02.20
Github CLI  (0) 2024.01.31
  (0) 2024.01.12
클론  (0) 2024.01.11
로컬 저장소 내역 깃허브 업로드  (0) 2024.01.10

1. pull

→ 원격 저장소의 버전이 로컬 저장소의 버전보다 앞서는 경우 원격 저장소의 갱신 내역을 로컬 저장소에 반영해주는 것

 

1) 소스트리에서 pull

 

먼저, 해당 경로에 파일을 생성한다.

 

다운받고자 하는 주소 복사

 

위와 같이 클론해주면 커밋 내역까지 잘 불러온 것을 확인할 수 있다.

 

해당 파일 생성해주고

 

add와 commit을 진행해준다.

 

위와 같이 푸시해준 후

 

깃허브 확인 시 위와 같이 잘 추가된 것을 확인할 수 있다.

 

git_sourcetree 로컬 저장소에서 원격저장소(깃허브)를 이용하여 pull을 진행한다.

 

해당 폴더를 확인해보면 위와 같이 회사에서 작업한 코드가 추가된 것을 확인할 수 있다.

 

※ 즉, clone은 최초 한 번만 실행해준 후 pull을 이용하여 여러 PC에서 같은 버전의 코드를 유지할 수 있다.

 

2) CLI에서 pull

마찬가지로 먼저 pc2_git_cli 폴더를 생성해준다.

 

깃허브에서 클론할 주소 복사 후

 

위와 같이 클론을 진행한다. (주소 뒤에 . 붙여주는 거 잊지 말기!)

 

이와 같이 잘 추가되어 있는 것을 확인할 수 있다.

 

새로운 파일 생성 후

 

이와 같이 add, commit, push를 차례대로 수행해주면

 

깃허브에도 해당 파일이 잘 추가되어 있는 것을 확인할 수 있다.

 

다시 git_cli 저장소에서 pull 명령어를 수행해주면

 

마찬가지로 해당 파일이 추가된 것을 볼 수 있고, 두 대의 PC가 같은 환경이 되었다고 할 수 있다.

'네트워크캠퍼스 > GIT, GITHUB' 카테고리의 다른 글

Github CLI  (0) 2024.01.31
.gitignore 파일의 필요성  (0) 2024.01.12
클론  (0) 2024.01.11
로컬 저장소 내역 깃허브 업로드  (0) 2024.01.10
병합  (0) 2024.01.05

1. 사용제한자(Usage Level modifier)

1) static

- 변수, 메서드에 적용되는 자바의 키워드

- 해당 클래스의 객체 없이도 참조 가능

- static 블록 안에는 static 변수만 사용해야 하고, static 메서드만 호출가능

- 지정된 변수와 메서드를 객체와 무관하게 만들어주기 때문에 this를 가질 수 없음

- non-static 메서드로 재정의될 수 엇음

- 대표적인 static 메서드는 main() 메서드

- static에 단순히 블록({})을 사용한 경우에는 정적 초기화자라고 부름

  → static 변수를 초기화하는 역할을 가지고 클래스가 로딩될 때 main() 메서드가 있더라도 앞서 딱 한 번 실행

 

2) 정적 변수 (static field)

- 모든 객체들이 공유하는 공유 변수

- 객체 생성 없이 클래스 이름만으로 참조 가능

- 객체를 만들어 참조할 수도 있지만 객체를 만들지 않고도 참조가 가능하기 때문에 이를 클래스 변수라고도 부름

public class Asean {
	// 출석 20, 발표 30, 기말 50
	public String name; 
	private int attendanceScore; // 출결점수
	private int finalTermScore;   // 기말점수

	public static int presentationScore; // 29
	
	public Asean(String name, int attendanceScore, int finalTermScore) {
		this.name = name;
		this.attendanceScore = attendanceScore;
		this.finalTermScore = finalTermScore;
	}
	
	// static 블록 내부 코드는 프로그램 시작 시 즉시 자동으로 한 번 호출
	static {
			presentationScore = 29;
	}
	
	public void showStudentScore() {
		System.out.println("학생명 : " + this.name);
		System.out.println("출결점수 : " + this.attendanceScore);
		System.out.println("발표점수 : " + presentationScore);
		System.out.println("기말점수 : " + this.finalTermScore);
		System.out.println("최종점수 : " + (this.attendanceScore + presentationScore + this.finalTermScore));
		System.out.println("===========================================");
	}
}
public class MainClass {
	public static void main(String[] args) {
		// 인스턴스생성 전부터 이미 조회 가능한 팀점수
		System.out.println(Asean.presentationScore);
	
		// 학생 4명 생성
		Asean a1 = new Asean("가", 20, 43);
		Asean a2 = new Asean("나", 15, 30);
		Asean a3 = new Asean("다", 10, 35);
		Asean a4 = new Asean("라", 18, 40);
	
		a1.showStudentScore();
		a2.showStudentScore();
		a3.showStudentScore();
		a4.showStudentScore();
	
		// 어떤 인스턴스를 활용해도 팀 점수 조회 가능
		System.out.println(a1.presentationScore);
		System.out.println(a2.presentationScore);
		System.out.println(a3.presentationScore);
		System.out.println(a4.presentationScore);
	}
}

위 그림과 같이 static 변수로 지정하면 main() 함수보다 앞서 실행되고, 해당 변수는 객체들이 전체적으로 공유하는 값으로 호출이 가능하다.

즉, 해당 변수는 힙 영역에 있는 것이 아니므로 this 키워드는 사용 불가하다.

위 코드에서 presentationScore가 public으로 선언되어 있으므로 어떤 인스턴스를 활용하더라도 호출이 가능하다.

 

2) 정적 메서드 (static method)

- 해당 클래스의 객체 생성 없이도 참조 가능

- static 메서드 안에서는 non-static 멤버를 객체 생성 없이 직접 참조 불가

- static 메서드 안에서는 static 변수를 선언할 수 없음

public class Asean {
	// 출석 20, 발표 30, 기말 50
	public String name; 
	private int attendanceScore; // 출결점수
	private int finalTermScore;   // 기말점수

	private static int presentationScore; // 29
	
	public Asean(String name, int attendanceScore, int finalTermScore) {
		this.name = name;
		this.attendanceScore = attendanceScore;
		this.finalTermScore = finalTermScore;
	}
	
	// static 블록 내부 코드는 프로그램 시작 시 즉시 자동으로 한 번 호출
	static {
			presentationScore = 29;
	}
	
	// 스태틱 메서드도 객체 없이 바로 호출 가능
	public static void showPresentationScore() {
		System.out.println(presentationScore);
	}
}

위 코드에서 presentationScore이 private으로 지정되어 있으므로 객체를 생성하지 않고서는 호출이 불가하다.

→ 스태틱 메서드를 활용하면 호출 가능

public class MainClass {

	public static void main(String[] args) {
		// 인스턴스생성 전부터 이미 조회 가능한 팀점수
		// System.out.println(Asean.presentationScore); // private이므로 호출 불가
		// 스태틱 메서드도 스태틱 변수처럼 호출 가능
		Asean.showPresentationScore(); 
		}
}

위와 같이 static 메서드를 활용하여 접근 가능하고 private 변수로 선언되어 있어 외부에서 변수의 값 자체를 변경할 수 없다는 장점이 있다.

'네트워크캠퍼스 > JAVA' 카테고리의 다른 글

final  (0) 2024.01.15
싱글톤 패턴  (0) 2024.01.15
매개변수의 다형성  (0) 2024.01.11
배열의 다형성  (0) 2024.01.10
클래스의 다형성  (0) 2024.01.09

1. clone

→ 다른 PC에 업로드했던 원격저장소의 코드를 로컬저장소에 내려받는 행위

→ 여러 PC에서 파일을 한 버전으로 유지할 수 있다.

 

git_cli와 git_sourcetree 폴더의 내용물을 지운 상태에서 진행 (.git도 지우기)

1) 소스트리에서 클론하기

내려받고자 하는 repository의 코드 주소를 복사한다.

 

위와 같이 복사한 주소와 내려받을 폴더 경로를 지정해준 후 클론한다.

 

위와 같이 잘 복사된 것을 확인할 수 있다.

 

2) CLI에서 클론하기

CLI에서도 마찬가지로 받고자 하는 repository의 주소를 복사한다.

 

git clone 주소 . 명령어를 통해 복사한다.

※ 이때 주소 뒤에 .을 반드시 붙여주어야 한다.

 

이와 같이 잘 복사된 것을 확인할 수 있다.

'네트워크캠퍼스 > GIT, GITHUB' 카테고리의 다른 글

.gitignore 파일의 필요성  (0) 2024.01.12
  (0) 2024.01.12
로컬 저장소 내역 깃허브 업로드  (0) 2024.01.10
병합  (0) 2024.01.05
브랜치  (0) 2024.01.04

1. 매개변수의 다형성

※ Promotion : 자동 형변환 vs Casting : 명시적 형변환

- promotion은 멤버 변수의 값을 대입할 때 발생하지만, 메서드 호출 시 사용하는 매개변수에도 발생 가능

- 보통 메서드 호출 시 선언부에서 지정한 데이터타입과 일치하는 매개값을 전달하여 호출하지만, 매개변수에 다형성을 적용하면 자식 객체 전달 가능

 

1) 강제 타입 변환(Type Casting)

→ 부모 타입을 자식 타입으로 변환하는 것

- 부모 타입으로 형 변환이 된 자식 객체만 강제 타입 변환 사용 가능

 

public class Parent {
	public void method1() {
		System.out.println("부모측 1번 메서드 호출");
	}
	
	public void method2() {
		System.out.println("부모측 2번 메서드 호출");
	}
}
public class Child extends Parent{
	@Override
	public void method2() {
		System.out.println("자식측에서 재정의한 2번 메서드");
	}
	
	public void method3() {
		System.out.println("자식만 가지고 있는 3번 메서드");
	}
}
public class MainClass1 {
	public static void main(String[] args) {
		// Promotion이 적용되면 자식클래스에만 정의된 요소 조회 불가능
		Parent p = new Child();
		p.method1(); // Parent에만 정의된 메서드
		p.method2(); // 오버라이딩된 메서드는 타입상관없이 인스턴스 내 자식쪽 호출
		//p.method3(); // p 타입 변수로는 자식쪽에만 정의된 요소 호출 불가
		System.out.println("-----------------");
	}
}

 

Parent p = new Child;

① 좌변에 부모클래스, 우변에 자식클래스     

② 동일한 메서드가 있어야 함 (@Override)

→ 우선순위는 자식쪽에 있음, 부모타입임에도 불구하고 자식쪽 메서드를 호출할 수 있다. → Promotion

 

public class MainClass1 {
	public static void main(String[] args) {
		// Promotion이 적용되면 자식클래스에만 정의된 요소 조회 불가능
		Parent p = new Child();
		p.method1(); // Parent에만 정의된 메서드
		p.method2(); // 오버라이딩된 메서드는 타입상관없이 인스턴스 내 자식쪽 호출
		//p.method3(); // p 타입 변수로는 자식쪽에만 정의된 요소 호출 불가
		System.out.println("------------------------");
		
		Child c = (Child)p; // 부모타입 변수를 자식타입으로 강제형변환(cast)
		c.method2(); // 위와 동일하게 자식측 method2 호출
		c.method3(); // 형 변환 후에는 자식쪽에만 있는 요소도 호출 가능
		
		Child cc = new Child(); // 애초에 자식타입으로 인스턴스 대입 시에도
		cc.method3(); // 자식쪽에만 있는 요소 호출 가능
	}
}

 

Child c = (Child) p;

 

 

★ 부모타입 변수로 자식타입 인스턴스 호출 시

① 부모클래스에만 선언된 메서드 : 부모클래스의 메서드로 호출

② 부모클래스, 자식클래스 모두에 선언된 메서드 (오버라이딩) : 자식클래스의 메서드로 호출

③ 자식클래스에만 선언된 메서드 : 부모 타입으로 호출 불가

 

public class Child2 extends Parent{
	@Override
	public void method2() {
		System.out.println("2번 자식측에서 재정의한 2번 메서드");
	}
	
	public void method3() {
		System.out.println("2번 자식만 가지고 있는 3번 메서드");
	}
}
public class MainClass2 {

	public static void main(String[] args) {
		// Parent 타입에는 Child, Child2 모두 대입 가능
		Parent p1 = new Child(); // 이 부분만 고쳐도 되는 효율성
		p1.method2(); 
		
		// Parent 타입으로는 Child1의 method2도, Child2의 method2도 호출 가능
		// method2는 Parent에도 정의되어 있지만, Child와 Child2에서 오버라이딩된 메서드이기 때문에 호출 가능
	}
}

 

public class MainClass2 {

	public static void main(String[] args) {
		// Parent 타입에는 Child, Child2 모두 대입 가능
		Parent p1 = new Child2(); // 이 부분만 고쳐도 되는 효율성
		p1.method2(); 
		
		// Parent 타입으로는 Child1의 method2도, Child2의 method2도 호출 가능
		// method2는 Parent에도 정의되어 있지만, Child와 Child2에서 오버라이딩된 메서드이기 때문에 호출 가능
	}
}

 

 

 

2. instanceof 키워드

→ 객체가 지정한 클래스의 인스턴스인지 아닌지 검사할 때 사용

Person p = new student();
p instanceof Student // true 반환

왼쪽 항의 객체가 오른쪽 항 클래스의 인스턴스, 즉 오른쪽 항의 객체가 생성되었다면 true 리턴

 

public class Human {
	
	public String name;
	public int age;
	
	public Human(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Human() {
		this("noname", 0);
		// this.name = "noname";
		// this.age = 0;
	}
	
	public void showInfo() {
		System.out.println("이름: " + this.name);
		System.out.println("나이: " + this.age);
		System.out.println("---------------");
	}
}
public class Student extends Human {
	public Student(String name, int age) {
		super(name, age);
	}
}
public class Cat {
	private String name;
	private int age;
	
	public Cat(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public void meow() {
		System.out.println("야옹 야옹");
	}
}
public class MainClass {

	public static void main(String[] args) {
		// Human, Student, Cat 인스턴스 생성
		Human h1 = new Human("김자바", 20);
		h1.showInfo();
		
		Student s1 = new Student("태국인", 19);
		s1.showInfo();
		
		Cat c1 = new Cat("룰루", 6);
		c1.meow();
		
		System.out.println(h1 instanceof Human); // h1이 Human 기반인가
		System.out.println(s1 instanceof Human); // s1이 Human 기반인가
		System.out.println(h1 instanceof Student); // h1이 Student 기반인가
		System.out.println(s1 instanceof Student); // s1이 Student 기반인가
		// 관련이 아예 없는 객체간 비교는 에러 발생
		//System.out.println(h1 instanceof Cat);
		//System.out.println(s1 instanceof Cat);
	}
}

'네트워크캠퍼스 > JAVA' 카테고리의 다른 글

싱글톤 패턴  (0) 2024.01.15
사용제한자  (0) 2024.01.12
배열의 다형성  (0) 2024.01.10
클래스의 다형성  (0) 2024.01.09
정보은닉, 캡슐화  (0) 2024.01.08

1. 파일과 디렉터리

1) 파일

※ 리눅스에서는 폴더마저 파일로 분류됨

→ 리눅스에서는 모든 것이 파일로 되어 있음

 

2) 디렉터리

- 모든 폴더 상위에 루트폴더(/) 존재

- 루트 디렉토리 하위에 모든 저장장치가 매칭

 

3) 대표적인 디렉터리

/bin 대부분의 명령어 실행파일
시스템과 관련된 중요한 명령어들이 주로 저장
/dev 디바이스(장치) 파일이 배치
디스크, 키보드, 마우스 등의 하드웨어를 제어할 수 있도록 돕는 특수 파일
/etc 리눅스에서 사용하는 대부분의 설정파일
애플리케이션 및 리눅스 자체 설정 파일
/home 각 사용자 계정명으로 생성되는 디렉터리
해당 사용자의 개인적 파일 저장
/sbin 시스템 관리자용 명령어 저장 (root 권한이 필요)
/tmp 임시저장파일
/usr 유저정보
/var 마운트된 정보

 

4) 절대경로 vs 상대경로

절대경로 : 해당 요소의 모든 경로를 기입해 경로를 지정하는 것

상대경로 : 현재 명령을 내리는 지점/파일 위치를 감안해서 상대적으로 위치를 지정하는 것

 

5) 와일드카드 

ex) $ ls ab* : ab로 시작하는 모든 파일 조회

ex) $ ls ab? : ab로 시작하는 3글자 파일 조회

 

6) cd 명령어

→ 디렉토리 간 이동

 

7) ls 명령어

→ 파일 목록 출력

-l 상세조회
-a 전체조회(숨김파일까지 조회)
-t 생성날짜 내림차순으로 조회
-F 파일 종류 조회
/:디렉터리  *:실행가능파일  @:심볼릭링크
ls 경로 해당 경로 내부 조회
-w [숫자] 해당 숫자만큼의 열로 출력
--quote-name 파일이름에 따옴표 붙임

루트폴더 내의 모든 요소 조회 가능

파일이름에 따옴표를 붙여서 출력

 

 

2. 파일 조작 명령어

1) mkdir : 디렉터리 생성

-p 옵션 : 여러 개의 디렉터리 한 번에 생성 가능

 

2) touch : 파일 생성

위와 같이 나열하여 여러 개 파일을 한번에 생성할 수도 있다.

 

3) rm, rmdir : 파일, 디렉터리 삭제

rm -r : 데릭터리와 디렉터리 하위 모든 것 삭제

rm -i 파일명 : 삭제할지 말지 확인 후 삭제

 

4) cat : 파일 내용 출력

-n 옵션 : 행 번호 출력

 

 

5) less : 스크롤 출력

space, f, ctrl+v : 한 화면 아래로 스크롤

b, alt+v : 한 화면 위로 스크롤

j, ctrl+n, enter : 한 행 아래로 스크롤

k, ctrl+p : 한 행 위로 스크롤

q : less 명령어 종료

 

6) cp : 파일, 디렉터리 복사

cp [옵션] [복사할파일] [복사할위치]

-i 옵션 : 덮어쓰기 전 경고

-r 옵션 : 디렉터리 복사 시 사용

위와 같이 디렉터리 복사 시에는 -r 옵션을 사용한다.

디렉터리 안에 있던 파일까지 모두 복사된 것을 확인할 수 있다.

 

7) mv : 파일 이동, 이름 변경

① 파일 이동

mv [옵션] [이동할파일] [목적지]

b.txt 파일이 test3 디렉터리로 잘 이동된 것을 확인할 수 있다.

위와 같이 여러 파일을 한 번에 옮기는 것도 가능하다.

디렉터리 이동의 경우 -r 옵션을 주지 않아도 된다.

 

② 파일명 변경

a.txt가 b.txt로 변경된 것을 확인할 수 있다.

 

8) ln : 링크 생성

※ 링크 : 리눅스 파일에 별명을 붙이는 것 → 별명으로 호출하는 것이 가능

ln [옵션] [링크할파일] [링크이름]

① 하드링크

 한 파일에 이름을 여러개 부여하는 것

위와 같이 file2를 열어보면 file1의 내용과 같은 것을 출력한다.

그냥 보기에는 복사와 같다고 생각할 수 있지만, 위와 같이 file의 내용을 수정하면 file2의 내용도 똑같이 변경되어 있는 것을 확인할 수 있다.

하드링크의 경우 원본을 삭제하더라도 위와 같이 계속 역할을 수행할 수 있다.

 

② 심볼릭링크

→ 디렉터리는 하드링크로 지정할 수 없고, 서로 다른 디스크에 걸쳐서 만드는 것이 불가능하다.

ln -s [링크할파일] [링크이름]

심볼릭링크의 경우 원본이 삭제되면 기능을 수행할 수 없게 된다.

즉, 바로가기의 기능처럼 참조형으로 해당 파일의 위치만 가지고 있기 때문에 링크가 깨진 심볼릭 링크는 사용할 수 없다.

위와 같이 심볼릭 링크의 원본이 삭제되면 연결된 링크 파일은 동작하지 않는 것을 확인할 수 있다.

 

☆ 링크를 사용하는 이유

① 긴 절대경로를 별명으로 줄여서 사용하기 위해

② 버전이 여러 개인 파일이 한 폴더에 있을 때 구분하기 위해

 

9) 파일 찾기

① find : 디렉터리에서 파일 찾기

find [검색할디렉터리] [검색조건] [액션]

현재 작업폴더에서 a 파일을 찾아 콘솔에 찍어달라는 의미이다.

 

② grep : 특정 문자열이 포함된 파일 찾기

grep [찾는문자] [경로]

위와 같이 cat.txt 파일에서 print라는 문자가 포함된 열만 출력한다.

-i 대소문자 구분 없이 검색 
-v 해당 문자가 포함되지 않은 문장 검색
-r 해당 디렉토리 하위까지 검색
--color 찾은 문자열 강조, 기본은 빨간색

콘솔에 hello world를 찍고, 그 중 hello가 포함된 줄만 출력하라는 의미이다.

 

10) --help : 명령어 도움말 보기

- 사용법, 명령어의 기능적 설명, 지정할 수 있는 옵션목록과 설명 등의 내용

※ $ LANG=ko_KR.UTF-8 cat --help : 한글 문서가 있는경우 한글 출력

 

11) man : 메뉴얼 출력, --help에 비해 상세한 내용

man [키워드]

-k 옵션 : 특정 명령어 출력

위와 같이 복사 관련 키워드의 메뉴얼이 출력된다.

 

man cat 입력 시 CAT(1)이라고 나온다.

괄호 안에 숫자는 섹션을 의미한다.

1 : 명령어

2 : 시스템콜

3 : 라이브러리 함수

4 : 디바이스파일

5 : 파일 서식

6 : 게임

7 : 기타

8 : 시스템 관리 명령어

9 : 커널 루틴

 

man [섹션번호] [이름] 

-wa 옵션 : 해당 명령어가 몇 번 섹션 번호 문서가 존재하는지 볼 수 있다.

 

12) which : 명령어 검색

which [옵션] [명령어]

 

 

3. 파일 권한 변경하기

→ 중요한 시스템 파일들을 함부로 제어하지 못하게 막기 위한 목적

 

1) 10자리 비트 -rwxrwxrwx

① 첫 자리

- : 일반 파일

d : 디렉터리

l : 심볼릭 링크

b : 블록장치

c : 문자장치

s : 소켓

p : 이름 있는 파이프

 

② 나머지는 세글자씩 묶기

r : 읽기 (4)

w : 쓰기 (2) 

x : 실행 (1)

 

③ 3비트씩 쪼갠 것의 의미

소유자의 권한, 그룹의 권한, 다른 사용자 및 그룹의 권한

 

2) chmod

$ chmod 숫자(3자리) 파일명 

745 : 소유자(rwx), 그룹(r), 다른사용자(rx) 의 권한을 가짐

 

$ chmod -R 숫자(3자리) 디렉터리 및 경로

위와 같이 test 디렉터리 안에 두 개의 파일이 있을 때

 

-R 옵션을 사용하면 디렉터리와 그 안의  파일들까지 모두 해당 권한으로 변경되는 것을 확인할 수 있다.

 

 

4. 파일 소유권 변경하기

☆ 소유권 변경이 가능한 사용자는 루트계정뿐 

1) $ su -

위 명령어를 통해 루트계정으로 변경한 후 진행

 

2) chown

# chown 유저명 파일명

# chown 유저명:그룹명 파일명

# chown -R 유저명:(그룹명) 파일명

 

루트 계정에서 rootuser.txt 파일을 생성해준다.

다시 일반사용자 계정으로 돌아와서 vi를 통해 해당 파일을 열어준다.

위와 같이 일반사용자 계정은 r 권한만 있기 때문에 readonly 경고가 뜨는 것을 확인할 수 있다.

루트 계정에서 chown 명령어를 이용하여 rootuser.txt 파일의 소유권을 ubuntu 계정으로 변경해준다.

다시 ubuntu로 돌아와서 rootuser.txt 파일 내용을 수정해보면 잘 변경되는 것을 확인할 수 있다.

'네트워크캠퍼스 > LINUX' 카테고리의 다른 글

프로세스  (0) 2024.01.16
텍스트에디터  (0) 2024.01.15
프롬프트  (0) 2024.01.10
Shell  (0) 2024.01.09
리눅스 개요  (0) 2024.01.09

+ Recent posts